Files
fastapi/docs/ja/docs/async.md
Motov Yurii 5ad9d258e4 🌐 Update translations for ja (update-all) (#14916)
* Update all

* 🎚 Auto format

* Add missing

* 🎚 Auto format

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-13 16:24:30 +01:00

28 KiB

䞊行凊理ず async / await

path operation 関数のための async def 構文に関する詳现ず、非同期コヌド、䞊行凊理、䞊列凊理の背景に぀いおです。

急いでいたすか

TL;DR:

次のように await で呌び出すよう指瀺されおいるサヌドパヌティラむブラリを䜿っおいるなら:

results = await some_library()

path operation 関数は次のように async def で宣蚀したす:

@app.get('/')
async def read_results():
    results = await some_library()
    return results

/// note | 備考

await は async def で䜜られた関数の内郚でしか䜿えたせん。

///


デヌタベヌス、API、ファむルシステムなどず通信し぀぀ await の䜿甚をサポヌトしおいないサヌドパヌティラむブラリ (珟圚のずころ倚くのデヌタベヌスラむブラリが該圓したす) を䜿っおいる堎合、path operation 関数は通垞どおり def で宣蚀しおください:

@app.get('/')
def results():
    results = some_library()
    return results

アプリケヌションが (䜕らかの理由で) ほかの䜕ずも通信せず応答を埅぀必芁がないなら、await を内郚で䜿わなくおも async def を䜿っおください。


よく分からない堎合は、通垞の def を䜿っおください。


備考: 必芁に応じお path operation 関数 では def ず async def を混圚させ、それぞれに最適な遞択肢で定矩できたす。FastAPI は適切に凊理したす。

いずれの堎合でも、FastAPI は非同期で動䜜し非垞に高速です。

ただし䞊蚘の手順に埓うこずで、さらにパフォヌマンス最適化が可胜になりたす。

技術詳现

モダンな Python は 「非同期コヌド」 を 「コルヌチン」 ず呌ばれる仕組みでサポヌトしおおり、構文は async ず await です。

以䞋のセクションで、このフレヌズをパヌツごずに芋おいきたす:

  • 非同期コヌド
  • async ず await
  • コルヌチン

非同期コヌド

非同期コヌドずは、蚀語 💬 がコヌドのどこかの時点で、コンピュヌタ/プログラム 🀖 に「どこか別のずころで終わるたで、別の䜕か」を埅぀必芁があるず䌝える手段を持っおいる、ずいうこずです。その「別の䜕か」を「遅いファむル」📝 ず呌ぶこずにしたしょう。

その間、コンピュヌタは「遅いファむル」📝 が終わるたで、他の䜜業を進められたす。

その埌、コンピュヌタ/プログラム 🀖 は、たた埅぀機䌚が来たずきや、その時点で抱えおいた䜜業をすべお終えたずきに戻っおきたす。そしお、埅っおいたタスクのどれかが終わっおいないか確認し、必芁な凊理を実行したす。

次に、最初に終わったタスク (たずえば「遅いファむル」📝) を取り、続きの凊理を行いたす。

この「別の䜕かを埅぀」は、通垞 I/O 操䜜を指し、(プロセッサや RAM の速床に比べお) 盞察的に「遅い」埅機を䌎いたす。䟋えば次のようなものです:

  • クラむアントからネットワヌク経由でデヌタが送られおくるのを埅぀
  • プログラムが送信したデヌタをクラむアントがネットワヌク経由で受け取るのを埅぀
  • ディスク䞊のファむル内容がシステムにより読み取られ、プログラムに枡されるのを埅぀
  • プログラムがシステムに枡した内容がディスクに曞き蟌たれるのを埅぀
  • リモヌト API 操䜜
  • デヌタベヌス操䜜の完了
  • デヌタベヌスク゚リが結果を返すのを埅぀
  • など

実行時間の倧半が I/O 操䜜の埅ち時間に費やされるため、これらは「I/O バりンド」な操䜜ず呌ばれたす。

「非同期」ず呌ばれるのは、コンピュヌタ/プログラムがその遅いタスクず「同期」(タスクがちょうど終わる瞬間を、䜕もせずに埅぀) する必芁がないからです。結果を受け取っお凊理を続けるために、空埅ちする必芁がありたせん。

代わりに「非同期」システムでは、タスクが終わったら、コンピュヌタ/プログラムが取りかかっおいる䜜業が終わるたで (数マむクロ秒ほど) 少し埅ち、結果を受け取りに戻っお凊理を続けられたす。

「非同期」ず察になる「同期」は、「シヌケンシャル」ず呌ばれるこずもありたす。埅機が含たれおいおも、別のタスクに切り替える前にコンピュヌタ/プログラムが手順を順番に実行するためです。

䞊行凊理ずハンバヌガヌ

䞊で説明した非同期コヌドの考え方は、「䞊行凊理」 ず呌ばれるこずもありたす。これは 「䞊列凊理」 ずは異なりたす。

䞊行凊理 も 䞊列凊理 も、「耇数のこずがだいたい同時に起きる」こずに関係したす。

ただし、䞊行凊理 ず 䞊列凊理 の詳现はかなり異なりたす。

違いを芋るために、ハンバヌガヌに関する次の物語を想像しおみおください。

䞊行ハンバヌガヌ

あなたは奜きな人ずファストフヌドを買いに行き、前の人たちの泚文をレゞ係が受ける間、列に䞊びたす。😍

やがおあなたの番になり、奜きな人ず自分のために、ずおも豪華なハンバヌガヌを2぀泚文したす。🍔🍔

レゞ係はキッチンの料理人に、あなたのハンバヌガヌを甚意するよう声をかけたす (料理人はいた前のお客さんの分を䜜っおいたす)。

支払いをしたす。💞

レゞ係はあなたに番号札を枡したす。

埅っおいる間、奜きな人ずテヌブルに移動しお座り、(豪華なハンバヌガヌは時間がかかるので) しばらく話したす。

テヌブルで埅っおいる間、奜きな人がどれだけ玠敵で、かわいくお、頭が良いかを眺めお時間を過ごせたす ✚😍✚。

時々カりンタヌの衚瀺を芋お、自分の番号になっおいるか確認したす。

やがおあなたの番になりたす。カりンタヌに行き、ハンバヌガヌを受け取り、テヌブルに戻りたす。

あなたず奜きな人はハンバヌガヌを食べお、楜しい時間を過ごしたす。✚

/// info | 情報

矎しいむラストは Ketrina Thompson によるものです。🎚

///


この物語で、あなた自身がコンピュヌタ/プログラム 🀖 だず想像しおみおください。

列にいる間は、䜕も「生産的」なこずをせず、自分の番を埅぀だけのアむドル状態 😎 です。ただしレゞ係は泚文を取るだけ (䜜りはしない) なので列は速く進み、問題ありたせん。

あなたの番になるず、実際に「生産的」な䜜業をしたす。メニュヌを芋お泚文を決め、奜きな人の分も確認し、支払い、正しい玙幣/カヌドを枡したか、正しく決枈されたか、泚文内容が正しいかなどを確認したす。

しかし、ハンバヌガヌはただ出来䞊がっおいないので、レゞ係ずのやり取りは「䞀時停止」⏞ になりたす。ハンバヌガヌができるたで埅぀ 🕙 必芁があるからです。

ただし、番号札を持っおカりンタヌから離れテヌブルに座れば、泚意を奜きな人に切り替え 🔀、「その䜜業」⏯ 🀓 に取り組めたす。奜きな人ずいちゃ぀くずいう、ずおも「生産的」🀓 なこずがたたできたす。

レゞ係 💁 がカりンタヌの衚瀺にあなたの番号を出しお「ハンバヌガヌができたした」ず知らせおも、あなたは衚瀺が切り替わった瞬間に飛び跳ねたりしたせん。自分の番号札があり、他の人にもそれぞれ番号札があるので、ハンバヌガヌを盗られるこずはないず知っおいるからです。

だから、奜きな人の話が終わるのを埅ち (珟圚の䜜業 ⏯ / 凊理䞭のタスクを完了し 🀓)、埮笑んで「ハンバヌガヌ取っおくるね」ず蚀いたす ⏞。

それからカりンタヌぞ行き 🔀、いた完了した初期のタスク ⏯ に戻っお、ハンバヌガヌを受け取り、瀌を蚀っおテヌブルに持っおいきたす。これでカりンタヌずのやり取りずいうステップ/タスクは完了 ⏹ です。その結果ずしお「ハンバヌガヌを食べる」🔀 ⏯ ずいう新しいタスクが生たれたすが、先の「ハンバヌガヌを受け取る」タスクは完了 ⏹ しおいたす。

䞊列ハンバヌガヌ

今床は、これが「䞊行ハンバヌガヌ」ではなく「䞊列ハンバヌガヌ」だず想像したしょう。

あなたは奜きな人ず「䞊列」ファストフヌドを買いに行きたす。

耇数のレゞ係 (䟋えば 8 人) が同時に料理人でもあり、前の人たちの泚文を受けおいたす。

8 人のレゞ係はそれぞれ、次の泚文を取る前にすぐに調理に取りかかるため、あなたの前の人たちはカりンタヌを離れず、ハンバヌガヌができるのを埅っおいたす。

ようやくあなたの番になり、奜きな人ず自分のために豪華なハンバヌガヌを 2 ぀泚文したす。

支払いをしたす 💞。

レゞ係はキッチンに向かいたす。

番号札がないため、他の誰かに先に取られないよう、カりンタヌの前で立っお埅ちたす 🕙。

あなたず奜きな人は、誰にも割り蟌たれずハンバヌガヌが来たらすぐ受け取れるよう芋匵っおいるので、奜きな人に泚意を向けられたせん。😞

これは「同期」的な䜜業です。レゞ係/料理人 👚‍🍳 ず「同期」しおいたす。レゞ係/料理人 👚‍🍳 がハンバヌガヌを䜜り終えお手枡すその瞬間に、埅っお 🕙 その堎にいなければなりたせん。そうでないず他の誰かに取られるかもしれたせん。

長い時間 🕙 カりンタヌ前で埅った埌、ようやくレゞ係/料理人 👚‍🍳 がハンバヌガヌを持っお戻っおきたす。

ハンバヌガヌを受け取り、奜きな人ずテヌブルに行きたす。

食べお、おしたいです。⏹

ほずんどの時間をカりンタヌ前で埅぀ 🕙 のに費やしたため、あたり話したり、いちゃ぀いたりできたせんでした。😞

/// info | 情報

矎しいむラストは Ketrina Thompson によるものです。🎚

///


この「䞊列ハンバヌガヌ」のシナリオでは、あなたは 2 ぀のプロセッサ (あなたず奜きな人) を持぀コンピュヌタ/プログラム 🀖 で、どちらも長い間 🕙「カりンタヌでの埅機」に泚意 ⏯ を専念しおいたす。

ファストフヌド店には 8 個のプロセッサ (レゞ係/料理人) がありたす。䞀方、䞊行ハンバヌガヌの店には (レゞ係 1、人、料理人 1 人の) 2 個しかなかったかもしれたせん。

それでも、最終的な䜓隓は最良ずは蚀えたせん。😞


これはハンバヌガヌにおける䞊列版の物語です。🍔

より「珟実的な」䟋ずしお、銀行を想像しおみおください。

぀い最近たで、ほずんどの銀行には耇数の窓口係 👚‍💌👚‍💌👚‍💌👚‍💌 ず長い行列 🕙🕙🕙🕙🕙🕙🕙🕙 がありたした。

各窓口係が、䞀人ず぀、すべおの䜜業を順番に行いたす 👚‍💌⏯。

そしお、長時間 🕙 行列で埅たなければ順番を倱いたす。

銀行の甚事 🏊 に、奜きな人 😍 を連れお行きたいずは思わないでしょう。

ハンバヌガヌのたずめ

この「奜きな人ずファストフヌド」のシナリオでは、埅ち時間 🕙 が倚いため、䞊行システム ⏞🔀⏯ を䜿う方がはるかに理にかなっおいたす。

これは、ほずんどの Web アプリケヌションにも圓おはたりたす。

ずおも倚くのナヌザヌがいたすが、サヌバは圌らのあたり速くない回線からリク゚ストが届くのを埅ち 🕙、

その埌、レスポンスが戻っおくるのをたた埅ちたす 🕙。

この「埅ち」🕙 はマむクロ秒単䜍で枬られたすが、すべおを合蚈するず、結局かなりの埅ちになりたす。

だからこそ、Web API には非同期 ⏞🔀⏯ コヌドを䜿うのが理にかなっおいたす。

これが、NodeJS を人気にした芁因 (NodeJS 自䜓は䞊列ではありたせん) であり、プログラミング蚀語ずしおの Go の匷みでもありたす。

そしお、それが FastAPI で埗られるパフォヌマンスの氎準です。

さらに、䞊列性ず非同期性を同時に掻甚できるため、テストされた倚くの NodeJS フレヌムワヌクより高い性胜を発揮し、C に近いコンパむル蚀語である Go ず同等の性胜になりたす (すべお Starlette のおかげです)。

䞊行凊理は䞊列凊理より優れおいる

いいえそれがこの話の教蚓ではありたせん。

䞊行凊理は䞊列凊理ずは異なりたす。そしお倚くの埅ち時間を䌎う特定のシナリオでは優れおいたす。そのため、䞀般に Web アプリ開発では䞊列凊理よりはるかに適しおいたす。しかし、すべおに察しお最良ずいうわけではありたせん。

バランスを取るために、次の短い物語を想像しおください。

倧きくお汚れた家を掃陀しなければならない。

はい、これで物語は党郚です。


どこにも埅ち 🕙 はなく、家の耇数箇所で倧量の䜜業があるだけです。

ハンバヌガヌの䟋のように順番を決めお、たずリビング、次にキッチン、ず進めおもよいのですが、䜕かを埅぀ 🕙 わけではなく、ひたすら掃陀するだけなので、順番は䜕も圱響したせん。

順番の有無 (䞊行性の有無) に関係なく、終了たでに同じ時間がかかり、同じ䜜業量をこなすこずになりたす。

しかしこの堎合、8 人の元レゞ係/料理人/珟枅掃員を連れおきお、それぞれ (あなたも加えお) 家の別々の゚リアを掃陀できれば、䞊列 に䜜業でき、より早く終えられたす。

このシナリオでは、各枅掃員 (あなたを含む) がプロセッサであり、それぞれが自分の圹割を果たしたす。

そしお実行時間の倧半は (埅ちではなく) 実䜜業が占め、コンピュヌタでの䜜業は CPU によっお行われたす。これらの問題は「CPU バりンド」ず呌ばれたす。


CPU バりンドな操䜜の䞀般的な䟋は、耇雑な数倀凊理が必芁なものです。

䟋えば:

  • オヌディオ や 画像凊理。
  • コンピュヌタビゞョン: 画像は数癟䞇のピクセルで構成され、各ピクセルには 3 ぀の倀/色があり、通垞、それらのピクセル䞊で同時に䜕かを蚈算する必芁がありたす。
  • 機械孊習: 倚くの「行列」や「ベクトル」の乗算が必芁になりたす。巚倧なスプレッドシヌトに数字が入っおいお、それらを同時にすべお掛け合わせるこずを想像しおください。
  • ディヌプラヌニング: 機械孊習のサブフィヌルドなので同様です。掛け合わせる数字が 1 ぀のスプレッドシヌトではなく膚倧な集合であり、倚くの堎合、それらのモデルを構築/利甚するための特別なプロセッサを䜿いたす。

䞊行凊理 + 䞊列凊理: Web + 機械孊習

FastAPI では、Web 開発で非垞に䞀般的な䞊行凊理 (NodeJS の䞻な魅力ず同じ) を掻甚できたす。

同時に、機械孊習システムのような CPU バりンド なワヌクロヌドに察しお、䞊列凊理やマルチプロセッシング (耇数プロセスの䞊列実行) の利点も掻甚できたす。

さらに、Python が デヌタサむ゚ンス、機械孊習、特にディヌプラヌニングの䞻芁蚀語であるずいう事実も盞たっお、FastAPI はデヌタサむ゚ンス/機械孊習の Web API やアプリケヌション (ほか倚数) に非垞に適しおいたす。

本番環境でこの䞊列性を実珟する方法は、デプロむ{.internal-link target=_blank} のセクションを参照しおください。

async ず await

モダンな Python には、非同期コヌドをずおも盎感的に定矩する方法がありたす。これにより、通垞の「シヌケンシャル」なコヌドのように曞けお、適切なタむミングで「埅ち」を行っおくれたす。

結果を返す前に埅ちが必芁で、これらの新しい Python 機胜をサポヌトしおいる操䜜がある堎合、次のように曞けたす。

burgers = await get_burgers(2)

ここでの鍵は await です。burgers に結果を保存する前に、get_burgers(2) がやるべきこずを終えるのを ⏞ 埅぀ 🕙 ように Python に䌝えたす。これにより Python は、その間に (別のリク゚ストを受け取るなど) ほかのこずを 🔀 ⏯ できるず分かりたす。

await が機胜するには、この非同期性をサポヌトする関数の内郚でなければなりたせん。そのためには async def で宣蚀したす:

async def get_burgers(number: int):
    # ハンバヌガヌを䜜るために非同期の凊理を行う
    return burgers

...def の代わりに:

# これは非同期ではない
def get_sequential_burgers(number: int):
    # ハンバヌガヌを䜜るためにシヌケンシャルな凊理を行う
    return burgers

async def を䜿うず、Python はその関数内で await 匏に泚意し、関数の実行を「䞀時停止」⏞ しおほかのこずをしに行き 🔀、戻っおくるこずができるず分かりたす。

async def な関数を呌ぶずきは「await」しなければなりたせん。したがっお、次は動きたせん:

# 動きたせん。get_burgers は async def で定矩されおいたす
burgers = get_burgers(2)

そのため、await で呌べるず謳っおいるラむブラリを䜿っおいる堎合は、それを䜿う path operation 関数 を async def で䜜る必芁がありたす。䟋えば:

@app.get('/burgers')
async def read_burgers():
    burgers = await get_burgers(2)
    return burgers

より発展的な技術詳现

await は async def で定矩された関数の内郚でしか䜿えないこずに気づいたかもしれたせん。

同時に、async def で定矩された関数は「await」される必芁がありたす。぀たり、async def を持぀関数は、やはり async def で定矩された関数の内郚からしか呌べたせん。

では、ニワトリず卵の話のように、最初の async 関数はどう呌ぶのでしょうか

FastAPI を䜿っおいる堎合は心配ありたせん。その「最初の」関数は path operation 関数 で、FastAPI が適切に実行しおくれたす。

しかし、FastAPI を䜿わずに async / await を䜿いたい堎合もありたす。

自分で async コヌドを曞く

Starlette (FastAPI も) は AnyIO の䞊に構築されおおり、暙準ラむブラリの asyncio ず Trio の䞡方に察応しおいたす。

特に、あなた自身のコヌド内で、より高床なパタヌンを必芁ずする発展的な䞊行凊理のナヌスケヌスに察しお、AnyIO を盎接䜿えたす。

仮に FastAPI を䜿っおいなくおも、AnyIO で独自の async アプリケヌションを曞けば、高い互換性ず利点 (䟋: 構造化䞊行性) を埗られたす。

私は AnyIO の䞊に薄い局ずしお、型泚釈を少し改善し、より良い補完やむンラむン゚ラヌなどを埗るための別ラむブラリも䜜りたした。たた、理解しお自分で async コヌドを曞くのに圹立぀フレンドリヌなむントロ/チュヌトリアルもありたす: Asyncer。特に、async コヌドず通垞の (ブロッキング/同期) コヌドを組み合わせる必芁がある堎合に有甚です。

非同期コヌドの他の圢匏

async ず await を䜿うこのスタむルは、蚀語ずしおは比范的新しいものです。

しかし、これにより非同期コヌドの取り扱いは倧幅に簡単になりたす。

同等 (ほが同䞀) の構文が最近の JavaScript (ブラりザず NodeJS) にも導入されたした。

それ以前は、非同期コヌドの扱いはかなり耇雑で難解でした。

以前の Python ではスレッドや Gevent を䜿えたしたが、コヌドの理解・デバッグ・思考がはるかに難しくなりたす。

以前の NodeJS / ブラりザ JavaScript では「コヌルバック」を䜿っおおり、「コヌルバック地獄」を招きたした。

コルヌチン

コルヌチンは、async def 関数が返すものを指す、ちょっず排萜た甚語です。Python はそれを、開始できおい぀か終了する関数のようなものずしお扱いたすが、内郚に await があるたびに内郚的に䞀時停止 ⏞ するかもしれないものずしお認識したす。

async ず await を甚いた非同期コヌドの機胜党䜓は、しばしば「コルヌチンを䜿う」ず芁玄されたす。これは Go の䞻芁機胜「Goroutines」に盞圓したす。

たずめ

䞊のフレヌズをもう䞀床芋おみたしょう:

モダンな Python は 「非同期コヌド」 を 「コルヌチン」 ず呌ばれる仕組みでサポヌトしおおり、構文は async ず await です。

今なら、より意味が分かるはずです。✚

これらすべおが (Starlette を通じお) FastAPI を支え、印象的なパフォヌマンスを実珟しおいたす。

非垞に発展的な技術的詳现

/// warning | 泚意

おそらく読み飛ばしおも倧䞈倫です。

これは FastAPI の内郚動䜜に関する、ずおも技術的な詳现です。

(コルヌチン、スレッド、ブロッキング等の) 技術知識があり、FastAPI が async def ず通垞の def をどう扱うかに興味がある堎合は、読み進めおください。

///

Path operation 関数

path operation 関数 を async def ではなく通垞の def で宣蚀した堎合、(サヌバをブロックしおしたうため) 盎接呌び出されるのではなく、倖郚のスレッドプヌルで実行され、それを埅機したす。

䞊蚘ずは異なる動䜜の別の非同期フレヌムワヌクから来おおり、ほんのわずかなパフォヌマンス向䞊 (箄 100 ナノ秒) を狙っお、蚈算のみの些现な path operation 関数 を玠の def で定矩するこずに慣れおいる堎合、FastAPI では効果がたったく逆になる点に泚意しおください。これらの堎合、path operation 関数 がブロッキングな I/O を行うコヌドを䜿っおいない限り、async def を䜿った方が良いです。

それでも、どちらの状況でも、FastAPI はあなたが以前䜿っおいたフレヌムワヌクよりも (少なくずも同等に) 高速である{.internal-link target=_blank} 可胜性が高いです。

䟝存関係

䟝存関係{.internal-link target=_blank} に぀いおも同様です。䟝存関係が async def ではなく暙準の def 関数である堎合、倖郚のスレッドプヌルで実行されたす。

サブ䟝存関係

耇数の䟝存関係や サブ䟝存関係{.internal-link target=_blank} を (関数定矩のパラメヌタずしお) 盞互に芁求させられたす。その䞀郚は async def、他は通垞の def で䜜られおいおも動䜜したす。通垞の def で䜜られたものは「await」される代わりに、倖郚スレッドプヌルからスレッド䞊で呌び出されたす。

その他のナヌティリティ関数

あなたが盎接呌び出すナヌティリティ関数は、通垞の def でも async def でも構いたせん。FastAPI はその呌び出し方に圱響を䞎えたせん。

これは、FastAPI があなたの代わりに呌び出す関数 (すなわち path operation 関数 ず䟝存関係) ずは察照的です。

ナヌティリティ関数が def の通垞関数であれば、(あなたのコヌドに曞いたずおりに) 盎接呌び出され、スレッドプヌルでは実行されたせん。関数が async def で䜜られおいる堎合は、その関数を呌ぶずきに await すべきです。


繰り返しになりたすが、これらは非垞に技術的な詳现で、該圓事項を怜玢しおここにたどり着いた堎合には圹立぀でしょう。

それ以倖の堎合は、䞊のセクションのガむドラむンに埓えば十分です: 急いでいたすか。