]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Japanese translation for Concurrency and async / await (#2058)
authorT. Tokusumi <41147016+tokusumi@users.noreply.github.com>
Sun, 7 Feb 2021 17:20:43 +0000 (02:20 +0900)
committerGitHub <noreply@github.com>
Sun, 7 Feb 2021 17:20:43 +0000 (18:20 +0100)
Co-authored-by: Taki Komiyama <39375566+komtaki@users.noreply.github.com>
Co-authored-by: Sho Nakamura <sh0nk.developer@gmail.com>
docs/ja/docs/async.md [new file with mode: 0644]
docs/ja/mkdocs.yml

diff --git a/docs/ja/docs/async.md b/docs/ja/docs/async.md
new file mode 100644 (file)
index 0000000..eff4f2f
--- /dev/null
@@ -0,0 +1,393 @@
+# äžŠè¡Œå‡Šç†ãš async / await
+
+*path operation é–¢æ•°*のための `async def` ã«é–¢ã™ã‚‹è©³çŽ°ãšéžåŒæœŸ (asynchronous) ã‚³ãƒŒãƒ‰ã€äžŠè¡Œå‡Šç† (Concurrency)、そしお、䞊列凊理 (Parallelism) ã®èƒŒæ™¯ã«ã€ã„お。
+
+## æ€¥ã„でいたすか
+
+<abbr title="too long; didn't read (長すぎお読めない人のための芁玄ずいう意味のスラング)"><strong>TL;DR:</strong></abbr>
+
+次のような、`await` ã‚’䜿甚しお呌び出すべきサヌドパヌティラむブラリを䜿甚しおいる堎合:
+
+```Python
+results = await some_library()
+```
+
+以䞋の様に `async def` ã‚’䜿甚しお*path operation é–¢æ•°*を宣蚀したす。
+
+```Python hl_lines="2"
+@app.get('/')
+async def read_results():
+    results = await some_library()
+    return results
+```
+
+!!! note "備考"
+    `async def` ã‚’䜿甚しお䜜成された関数の内郚でしか `await` ã¯äœ¿ç”šã§ããŸã›ã‚“。
+
+---
+
+デヌタベヌス、API、ファむルシステムなどず通信し、`await` ã®äœ¿ç”šã‚’サポヌトしおいないサヌドパヌティラむブラリ (珟圚のほずんどのデヌタベヌスラむブラリに圓おはたりたす) ã‚’䜿甚しおいる堎合、次の様に、単に `def` ã‚’䜿甚しお通垞通り *path operation é–¢æ•°* ã‚’宣蚀しおください:
+
+```Python hl_lines="2"
+@app.get('/')
+def results():
+    results = some_library()
+    return results
+```
+
+---
+
+アプリケヌションが (どういうわけか) ä»–の䜕ずも通信せず、応答を埅぀必芁がない堎合は、`async def` ã‚’䜿甚しお䞋さい。
+
+---
+
+よく分からない堎合は、通垞の `def` ã‚’䜿甚しお䞋さい。
+
+---
+
+**備考**: *path operation é–¢æ•°*に必芁なだけ `def` ãš `async def` ã‚’混圚させ、それぞれに最適なオプションを䜿甚しお定矩できたす。それに応じおFastAPIは正しい凊理を行いたす。
+
+ずにかく、䞊蚘のいずれの堎合でもFastAPIは非同期で動䜜し、非垞に高速です。
+
+しかし、䞊蚘のステップに埓うこずで、パフォヌマンスの最適化を行えたす。
+
+## æŠ€è¡“詳çް
+
+珟代版のPythonは「**非同期コヌド**」を、「**コルヌチン**」ず称されるものを利甚しおサポヌトしおいたす。これは **`async` ãš `await`** æ§‹æ–‡ã‚’甚いたす。
+
+次のセクションで、フレヌズ内のパヌツを順に芋おいきたしょう:
+
+* **非同期コヌド**
+* **`async` ãš `await`**
+* **コルヌチン**
+
+## éžåŒæœŸã‚³ãƒŒãƒ‰
+
+非同期コヌドずは、蚀語💬がコヌド内のどこかで、コンピュヌタ/プログラム🀖に *他の䜕か* ãŒã©ã“か別の箇所で終了するのを埅぀ように䌝える手段を持っおいるこずを意味したす。*他の䜕か* ã¯ã€Œé…いファむル📝」ず呌ばれおいるずしたしょう.
+
+したがっお、コンピュヌタは「遅いファむル📝」が終了するたで、他の凊理ができたす。
+
+コンピュヌタ/プログラム🀖は再び埅機する機䌚があるずきや、その時点で行っおいたすべおの䜜業が完了するたびに戻っおきたす。そしお、必芁な凊理をしながら、コンピュヌタ/プログラム🀖が埅っおいた凊理のどれかが終わっおいるかどうか確認したす。
+
+次に、それ🀖が最初のタスク (芁するに、先皋の「遅いファむル📝」)を終わらせお、そのタスクの結果を䜿う必芁がある凊理を続けたす。
+
+この「他の䜕かを埅぀」ずは、通垞以䞋の様なものを埅぀ような (プロセッサずRAMメモリの速床に比べお) ç›žå¯Ÿçš„に「遅い」<abbr title="むンプットずアりトプット">I/O</abbr> æ“äœœã‚’指したす:
+
+* ãƒãƒƒãƒˆãƒ¯ãƒŒã‚¯çµŒç”±ã§ã‚¯ãƒ©ã‚€ã‚¢ãƒ³ãƒˆã‹ã‚‰é€ä¿¡ã•れるデヌタ
+* ãƒãƒƒãƒˆãƒ¯ãƒŒã‚¯çµŒç”±ã§ã‚¯ãƒ©ã‚€ã‚¢ãƒ³ãƒˆãŒå—信する、プログラムから送信されたデヌタ
+* ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ãŠèª­ã¿å–られ、プログラムに枡されるディスク内のファむル内容
+* ãƒ—ログラムがシステムに枡しお、ディスクに曞き蟌む内容
+* ãƒªãƒ¢ãƒŒãƒˆAPI操䜜
+* ãƒ‡ãƒŒã‚¿ãƒ™ãƒŒã‚¹æ“äœœã®å®Œäº†
+* ãƒ‡ãƒŒã‚¿ãƒ™ãƒŒã‚¹ã‚¯ã‚šãƒªãŒçµæžœã‚’返すこず
+* ãªã©ã€‚
+
+実行時間のほずんどが<abbr title="むンプットずアりトプット">I/O</abbr> æ“äœœã®åŸ…ち時間が占めるため、このような操䜜を「I/O ãƒã‚Šãƒ³ãƒ‰ã€æ“äœœãšèš€ã„たす。
+
+コンピュヌタ/プログラムがこのような遅いタスクず「同期 (タスクの結果を取埗しお䜜業を続行するために、䜕もせずに、タスクが完了する瞬間を正確に埅぀)」する必芁がないため、「非同期」ず呌ばれたす。
+
+その代わりに、「非同期」システムであるこずにより、いったん終了するず、タスクは、コンピュヌタ/プログラムが既に開始した凊理がすべお完了するのをほんの少し (数マむクロ秒) åŸ…っお、結果を受け取りに戻っおきたす。そしお、凊理を継続したす。
+
+「同期」の堎合 (「非同期」ずは異なり)、「シヌケンシャル」ずいう甚語もよく䜿甚されたす。これは、コンピュヌタ/プログラムがすべおのステップを (埅機が䌎う堎合でも別のタスクに切り替えるこずなく) é †ç•ªã«å®Ÿè¡Œã™ã‚‹ãŸã‚ã§ã™ã€‚
+
+### äžŠè¡Œå‡Šç†ãšãƒãƒ³ãƒãƒŒã‚¬ãƒŒ
+
+䞊蚘の**非同期**コヌドのアむデアは、**「䞊行凊理」**ず呌ばれるこずもありたす。 **「䞊列凊理」**ずは異なりたす。
+
+**䞊行凊理**ず**䞊列凊理**はどちらも「倚かれ少なかれ同時に発生するさたざたなこず」に関連しおいたす。
+
+ただし、*䞊行凊理*ず*䞊列凊理*の詳现はたったく異なりたす。
+
+違いを確認するには、ハンバヌガヌに関する次の物語を想像しおみおください:
+
+### äžŠè¡Œãƒãƒ³ãƒãƒŒã‚¬ãƒŒ
+
+ファストフヌド🍔を食べようず、奜きな人😍ずレゞに䞊んでおり、レゞ係💁があなたの前にいる人達の泚文を受け぀けおいたす。
+
+それからあなたの番になり、奜きな人😍ず自分のために、2぀の非垞に豪華なハンバヌガヌ🍔を泚文したす。
+
+料金を支払いたす💞。
+
+レゞ係💁はキッチンの男👚‍🍳に向かっお、あなたのハンバヌガヌ🍔を準備しなければならないず䌝えるために䜕か蚀いたした (圌は珟圚、前のお客さんの商品を準備しおいたすが)。
+
+レゞ係💁はあなたに番号札を枡したす。
+
+埅っおいる間、奜きな人😍ず䞀緒にテヌブルを遞んで座り、奜きな人😍ず長い間話をしたす (泚文したハンバヌガヌは非垞に豪華で、準備に少し時間がかかるので✚🍔✚)。
+
+ハンバヌガヌ🍔を埅ちながら奜きな人😍ずテヌブルに座っおいる間、あなたの奜きな人がなんお玠晎らしく、かわいくお頭がいいんだず✚😍✚惚れ惚れしながら時間を費やすこずができたす。
+
+奜きな人😍ず話しながら埅っおいる間、ずきどき、カりンタヌに衚瀺されおいる番号をチェックしお、自分の番かどうかを確認したす。
+
+その埌、぀いにあなたの番になりたした。カりンタヌに行き、ハンバヌガヌ🍔を手に入れおテヌブルに戻りたす。
+
+あなたずあなたの奜きな人😍はハンバヌガヌ🍔を食べお、楜しい時間を過ごしたす✚。
+
+---
+
+䞊蚘のストヌリヌで、あなたがコンピュヌタ/プログラム🀖だず想像しおみおください。
+
+列にいる間、あなたはアむドル状態です😎。䜕も「生産的」なこずをせず、ただ自分の番を埅っおいたす。しかし、レゞ係💁は泚文を受け取るだけなので (商品の準備をしおいるわけではない)、列は高速です。したがっお、䜕も問題ありたせん。
+
+それから、あなたの番になったら、実に「生産的な」䜜業を行いたす🀓、メニュヌを確認し、欲しいものを決め、奜きな人😍の欲しいものを聞き、料金を支払い💞、珟金たたはカヌドを正しく枡したか確認し、正しく枅算されたこずを確認し、泚文が正しく通っおいるかなどを確認したす。
+
+しかし、ハンバヌガヌ🍔をただできおいないので、ハンバヌガヌの準備ができるたで埅機🕙する必芁があるため、レゞ係💁ずの䜜業は「䞀時停止⏞」になりたす。
+
+しかし、カりンタヌから離れお、番号札を持っおテヌブルに座っおいるずきは、泚意を奜きな人😍に切り替えお🔀、その䞊で「仕事⏯🀓」を行なえたす。その埌、奜きな人😍ずいちゃ぀くかのような、非垞に「生産的な🀓」こずを再び行いたす。
+
+次に、レゞ係💁は、「ハンバヌガヌの準備ができたした🍔」ず蚀っお、カりンタヌのディスプレむに番号を衚瀺したすが、衚瀺番号があなたの番号に倉わっおも、すぐに狂ったように飛んで行くようなこずはありたせん。あなたは自分の番号札を持っおいっお、他の人も自分の番号札があるので、あなたのハンバヌガヌ🍔を盗む人がいないこずは知っおいたす。
+
+なので、あなたは奜きな人😍が話し終えるのを埅っお (珟圚の仕事⏯ / å‡Šç†äž­ã®ã‚¿ã‚¹ã‚¯ã‚’終了したす🀓)、優しく埮笑んで、ハンバヌガヌを貰っおくるねず蚀いたす⏞。
+
+次に、カりンタヌぞ、いたから完了する最初のタスク⏯ぞ向かい、ハンバヌガヌ🍔を受け取り、感謝の意を衚しお、テヌブルに持っおいきたす。これで、カりンタヌずのやり取りのステップ/タスクが完了したした⏹。これにより、「ハンバヌガヌを食べる🔀⏯」ずいう新しいタスクが䜜成されたす。しかし、前の「ハンバヌガヌを取埗する」ずいうタスクは終了したした⏹。
+
+### äžŠåˆ—ハンバヌガヌ
+
+これらが「䞊行ハンバヌガヌ」ではなく、「䞊列ハンバヌガヌ」であるずしたしょう。
+
+あなたは奜きな人😍ず䞊列ファストフヌド🍔を買おうずしおいたす。
+
+列に䞊んでいたすが、䜕人かの料理人兌、レゞ係 (8人ずしたしょう) ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ãŒã‚なたの前にいる人達の泚文を受け぀けおいたす。
+
+8人のレゞ係がそれぞれ自分で泚文を受けるや吊や、次の泚文を受ける前にハンバヌガヌを準備するので、あなたの前の人達はカりンタヌを離れずに、ハンバヌガヌ🍔ができるのを埅っおいたす🕙。
+
+それからいよいよあなたの番になり、奜きな人😍ず自分のために、2぀の非垞に豪華なハンバヌガヌ🍔を泚文したす。
+
+料金を支払いたす💞。
+
+レゞ係はキッチンに行きたす👚‍🍳。
+
+あなたはカりンタヌの前に立っお埅ちたす🕙。番号札がないので誰もあなたよりも先にハンバヌガヌ🍔を取らないようにしたす。
+
+あなたず奜きな人😍は忙しいので、誰もあなたの前に来させたせんし、あなたのハンバヌガヌが到着したずき🕙に誰にも取るこずを蚱したせん。あなたは奜きな人に泚意を払えたせん😞。
+
+これは「同期」䜜業であり、レゞ係/料理人👚‍🍳ず「同期」したす。レゞ係/料理人👚‍🍳がハンバヌガヌ🍔を完成させおあなたに枡すたで埅぀🕙必芁があり、ちょうどその完成の瞬間にそこにいる必芁がありたす。そうでなければ、他の誰かに取られるかもしれたせん。
+
+その埌、カりンタヌの前で長い時間埅っおから🕙、぀いにレゞ係/料理人👚‍🍳がハンバヌガヌ🍔を枡しに戻っおきたす。
+
+ハンバヌガヌ🍔を取り、奜きな人😍ずテヌブルに行きたす。
+
+ただ食べるだけ、それでおしたいです。🍔⏹。
+
+ほずんどの時間、カりンタヌの前で埅぀のに費やされおいたので🕙、あたり話したりいちゃ぀くこずはありたせんでした😞。
+
+---
+
+この䞊列ハンバヌガヌのシナリオでは、あなたは2぀のプロセッサを備えたコンピュヌタ/プログラム🀖 (あなたずあなたの奜きな人😍) ã§ã‚り、䞡方ずも埅機🕙しおいお、圌らは「カりンタヌで埅機🕙」するこずに専念しおいたす⏯。
+
+ファストフヌド店には8぀のプロセッサ (レゞ係/料理人) ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ðŸ‘šâ€ðŸ³ãŒã‚りたす。䞀方、䞊行ハンバヌガヌ店には2人 (レゞ係ず料理人) ðŸ’ðŸ‘šâ€ðŸ³ã—かいなかったかもしれたせん。
+
+しかし、それでも、最終的な䜓隓は最高ではありたせん😞。
+
+---
+
+これは、ハンバヌガヌ🍔の話ず同等な話になりたす。
+
+より「珟実的な」䟋ずしお、銀行を想像しおみおください。
+
+最近たで、ほずんどの銀行は耇数の窓口👚‍💌👚‍💌👚‍💌👚‍💌に、行列🕙🕙🕙🕙🕙🕙🕙🕙ができおいたした。
+
+すべおの窓口で、次々ず、䞀人の客ずすべおの䜜業を行いたす👚‍💌⏯.
+
+その䞊、長時間、列に䞊ばなければいけたせん🕙。そうしないず、順番が回っおきたせん。
+
+銀行🏊での甚事にあなたの奜きな人😍を連れお行きたくはないでしょう。
+
+### ãƒãƒ³ãƒãƒŒã‚¬ãƒŒã®ãŸãšã‚
+
+この「奜きな人ずのファストフヌドハンバヌガヌ」のシナリオでは、埅機🕙が倚いため、䞊行システム⏞🔀⏯を䜿甚する方がはるかに理にかなっおいたす。
+
+これは、ほずんどのWebアプリケヌションに圓おはたりたす。
+
+倚くのナヌザヌがいたすが、サヌバヌは、あたり匷くない回線でのリク゚ストの送信を埅機🕙しおいたす。
+
+そしお、レスポンスが返っおくるのをもう䞀床埅機🕙したす。
+
+この「埅機🕙」はマむクロ秒単䜍ですが、それでも、すべお合算するず、最終的にはかなり埅機するこずになりたす。
+
+これが、Web APIぞの非同期⏞🔀⏯コヌドの利甚が理にかなっおいる理由です。
+
+ほずんどの既存の人気のあるPythonフレヌムワヌク (FlaskやDjangoを含む) ã¯ã€Pythonの新しい非同期機胜ができる前に䜜成されたした。したがっお、それらをデプロむする方法は、䞊列実行ず、新機胜ほど匷力ではない叀い圢匏の非同期実行をサポヌトしたす。
+
+しかし、WebSocketのサポヌトを远加するために、非同期Web Python (ASGI) ã®äž»ãªä»•様はDjangoで開発されたした。
+
+そのような非同期性がNodeJSを人気にした理由です (NodeJSは䞊列ではありたせんが)。そしお、プログラミング蚀語ずしおのGoの匷みでもありたす。
+
+そしお、それは**FastAPI**で埗られるパフォヌマンスず同じレベルです。
+
+たた、䞊列凊理ず非同期凊理を同時に実行できるため、テスト枈みのほずんどのNodeJSフレヌムワヌクよりも高く、Goず同等のパフォヌマンスが埗られたす。Goは、Cに近いコンパむル蚀語です <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(Starletteに感謝したす)</a>。
+
+### äžŠè¡Œã¯äžŠåˆ—よりも優れおいたすか
+
+いやそれはこの話の教蚓ではありたせん。
+
+䞊行凊理は䞊列凊理ずは異なりたす。倚くの埅機を䌎う**特定の**シナリオに適しおいたす。そのため、䞀般に、Webアプリケヌション開発では䞊列凊理よりもはるかに優れおいたす。しかし、すべおに察しおより良いずいうわけではありたせん。
+
+なので、バランスをずるために、次の物語を想像しお䞋さい:
+
+> ã‚なたは倧きくお汚れた家を掃陀する必芁がありたす。
+
+*はい、以䞊です*。
+
+---
+
+埅機🕙せず、家の䞭の耇数の堎所でたくさんの仕事をするだけです。
+
+あなたはハンバヌガヌの䟋のように、最初はリビングルヌム、次にキッチンのように順番にやっおいくこずができたすが、䜕かを埅機🕙しおいるわけではなく、ただひたすらに掃陀をするだけで、順番は䜕にも圱響したせん。
+
+順番の有無に関係なく (䞊行に) åŒã˜æ™‚間がかかり、同じ量の䜜業が行われるこずになるでしょう。
+
+しかし、この堎合、8人の元レゞ係/料理人/珟圹枅掃員👚‍🍳👚‍🍳👚‍🍳👚‍🍳👚‍🍳👚‍🍳👚‍🍳👚‍🍳を手配できお、それぞれ (さらにあなたも) ãŒå®¶ã®åˆ¥ã€…の堎所を掃陀できれば、远加の助けを借りお、すべおの䜜業を**䞊列**に行い、はるかに早く終了できるでしょう。
+
+このシナリオでは、枅掃員 (あなたを含む) ã®ãã‚Œãžã‚ŒãŒãƒ—ロセッサずなり、それぞれの圹割を果たしたす。
+
+たた、実行時間のほずんどは (埅機ではなく) å®Ÿéš›ã®äœœæ¥­ã«è²»ã‚„され、コンピュヌタでの䜜業は<abbr title="Central Processing Unit">CPU</abbr>によっお行われたす。これらの問題は「CPUバりンド」ず蚀いたす。
+
+---
+
+CPUバりンド操䜜の䞀般的な䟋は、耇雑な数孊凊理が必芁なものです。
+
+䟋えば:
+
+* **オヌディオ** ã‚„ **画像凊理**。
+* **コンピュヌタビゞョン**: ç”»åƒã¯æ•°ç™Ÿäž‡ã®ãƒ”クセルで構成され、各ピクセルには3぀の倀/色があり、通垞、これらのピクセルで䜕かを同時に蚈算する必芁がある凊理。
+* **機械孊習**: é€šåžžã€å€šãã®ã€Œè¡Œåˆ—」ず「ベクトル」の乗算が必芁です。巚倧なスプレッドシヌトに数字を入れお、それを同時に党郚掛け合わせるこずを考えおみおください。
+* **ディヌプラヌニング**: ã“れは機械孊習のサブフィヌルドであるため、同じこずが圓おはたりたす。乗算する数字がある単䞀のスプレッドシヌトではなく、それらの膚倧な集合で、倚くの堎合、それらのモデルを構築および/たたは䜿甚するために特別なプロセッサを䜿甚したす。
+
+### äžŠè¡Œå‡Šç† + äžŠåˆ—凊理: Web + æ©Ÿæ¢°å­Šç¿’
+
+**FastAPI**を䜿甚するず、Web開発で非垞に䞀般的な䞊行凊理 (NodeJSの䞻な魅力ず同じもの) ã‚’利甚できたす。
+
+ただし、機械孊習システムのような **CPUバりンド** ãƒ¯ãƒŒã‚¯ãƒ­ãƒŒãƒ‰ã«å¯Ÿã—お、䞊列凊理ずマルチプロセッシング (耇数のプロセスが䞊列で実行される) ã®åˆ©ç‚¹ã‚’掻甚するこずもできたす。
+
+さらに、Pythonが**デヌタサむ゚ンス**、機械孊習、特にディヌプラヌニングの䞻芁蚀語であるずいう単玔な事実により、FastAPIはデヌタサむ゚ンス/機械孊習のWeb APIおよびアプリケヌション (他の倚くのアプリケヌションずの) ã«éžåžžã«ã‚ˆãé©åˆã—おいたす。
+
+本番環境でこの䞊列凊理を実珟する方法に぀いおは、[デプロむ](deployment/index.md){.internal-link target=_blank}に関するセクションを参照しおください。
+
+## `async` ãš `await`
+
+珟代的なバヌゞョンのPythonには、非同期コヌドを定矩する非垞に盎感的な方法がありたす。これにより、通垞の「シヌケンシャル」コヌドのように芋え、適切なタむミングで「埅機」したす。
+
+結果を返す前に埅機する必芁があり、これらの新しいPython機胜をサポヌトする操䜜がある堎合は、次のようにコヌディングできたす。
+
+```Python
+burgers = await get_burgers(2)
+```
+
+カギは `await` ã§ã™ã€‚結果を `burgers`に保存する前に、`get_burgers(2)`の凊理🕙の完了を埅぀⏞必芁があるこずをPythonに䌝えたす。これでPythonは、その間に (別のリク゚ストを受信するなど) äœ•か他のこずができる🔀⏯こずを知りたす。
+
+`await` ãŒæ©Ÿèƒœã™ã‚‹ãŸã‚ã«ã¯ã€éžåŒæœŸå‡Šç†ã‚’サポヌトする関数内にある必芁がありたす。これは、`async def` ã§é–¢æ•°ã‚’宣蚀するだけでよいです:
+
+```Python hl_lines="1"
+async def get_burgers(number: int):
+    # ãƒãƒ³ãƒãƒŒã‚¬ãƒŒã‚’䜜成するために非同期凊理を実行
+    return burgers
+```
+
+...`def` ã®ã‹ã‚ã‚Šã«:
+
+```Python hl_lines="2"
+# éžåŒæœŸã§ã¯ãªã„
+def get_sequential_burgers(number: int):
+    # ãƒãƒ³ãƒãƒŒã‚¬ãƒŒã‚’䜜成するためにシヌケンシャルな凊理を実行
+    return burgers
+```
+`async def` ã‚’䜿甚するず、Pythonにその関数内で `await` åŒ (その関数の実行を「䞀時停止⏞」し、結果が戻るたで他の䜕かを実行🔀する) ã‚’認識しなければならないず䌝えるこずができたす。
+
+`async def` é–¢æ•°ã‚’呌び出すずきは、「await」しなければなりたせん。したがっお、これは機胜したせん:
+
+```Python
+# get_burgersはasync defで定矩されおいるので動䜜しない
+burgers = get_burgers(2)
+```
+
+---
+
+したがっお、 `await` ã§å‘Œã³å‡ºã™ã“ずができるラむブラリを䜿甚しおいる堎合は、次のように `async def` ã‚’䜿甚しお、それを䜿甚する*path operation é–¢æ•°*を䜜成する必芁がありたす:
+
+```Python hl_lines="2-3"
+@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` ã‚’䜿甚したい堎合は、<a href="https://docs.python.org/3/library/asyncio-task.html#coroutine" class="external-link" target="_blank">公匏Pythonドキュメントを参照しお䞋さい</a>。
+
+### éžåŒæœŸã‚³ãƒŒãƒ‰ã®ä»–の圢匏
+
+`async` ãš `await` ã‚’䜿甚するスタむルは、この蚀語では比范的新しいものです。
+
+非同期コヌドの操䜜がはるかに簡単になりたす。
+
+等䟡な (たたはほずんど同䞀の) æ§‹æ–‡ãŒã€æœ€è¿‘のバヌゞョンのJavaScript (ブラりザおよびNodeJS) ã«ã‚‚最近組み蟌たれたした。
+
+しかし、その前は、非同期コヌドの凊理はかなり耇雑で難解でした。
+
+以前のバヌゞョンのPythonでは、スレッドや<a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>が利甚できたした。しかし、コヌドは理解、デバック、そしお、考察がはるかに耇雑です。
+
+以前のバヌゞョンのNodeJS / ãƒ–ラりザJavaScriptでは、「コヌルバック」を䜿甚しおいたした。これは、<a href="http://callbackhell.com/" class="external-link" target="_blank">コヌルバック地獄</a>に぀ながりたす。
+
+## ã‚³ãƒ«ãƒŒãƒãƒ³
+
+**コルヌチン**は、`async def` é–¢æ•°ã«ã‚ˆã£ãŠè¿”されるものを指す非垞に排萜た甚語です。これは、開始できお、い぀か終了する関数のようなものであるが、内郚に `await` ãŒã‚るずきは内郚的に䞀時停止⏞されるこずもあるものだずPythonは認識しおいたす。
+
+`async` ãš `await` ã‚’甚いた非同期コヌドを䜿甚するすべおの機胜は、「コルヌチン」を䜿甚するものずしお䜕床もたずめられおいたす。Goの䞻芁機胜である「ゎルヌチン」に盞圓したす。
+
+## ãŸãšã‚
+
+䞊述したフレヌズを芋おみたしょう:
+
+> çŸä»£ç‰ˆã®Pythonは「**非同期コヌド**」を、「**コルヌチン**」ず称されるものを利甚しおサポヌトしおいたす。これは **`async` ãš `await`** æ§‹æ–‡ã‚’甚いたす。
+
+今では、この意味がより理解できるはずです。✚
+
+(Starletteを介しお) FastAPIに力を䞎えお、印象的なパフォヌマンスを実珟しおいるものはこれがすべおです。
+
+## éžåžžã«ç™ºå±•的な技術的詳çް
+
+!!! warning "泚意"
+    æã‚‰ãã‚¹ã‚­ãƒƒãƒ—しおも良いでしょう。
+
+    ã“の郚分は**FastAPI**の仕組みに関する非垞に技術的な詳现です。
+
+    ã‹ãªã‚Šã®æŠ€è¡“知識 (コルヌチン、スレッド、ブロッキングなど) ãŒã‚り、FastAPIが `async def` ãšé€šåžžã® `def` ã‚’どのように凊理するか知りたい堎合は、先に進んでください。
+    
+### Path operation é–¢æ•°
+
+*path operation é–¢æ•°*を `async def` ã®ä»£ã‚ã‚Šã«é€šåžžã® `def` ã§å®£èš€ã™ã‚‹ãšã€(サヌバヌをブロックするので) ç›ŽæŽ¥å‘Œã³å‡ºã™ä»£ã‚ã‚Šã«å€–郚スレッドプヌル (awaitされる) ã§å®Ÿè¡Œã•れたす。
+
+䞊蚘の方法ず違った方法の別の非同期フレヌムワヌクから来おおり、小さなパフォヌマンス向䞊 (箄100ナノ秒) ã®ãŸã‚ã«é€šåžžã® `def` ã‚’䜿甚しお些现な挔算のみ行う *path operation é–¢æ•°* ã‚’定矩するのに慣れおいる堎合は、**FastAPI**ではたったく逆の効果になるこずに泚意しおください。このような堎合、*path operation é–¢æ•°* ãŒãƒ–ロッキング<abbr title="入力/出力: ãƒ‡ã‚£ã‚¹ã‚¯ã®èª­ã¿å–りたたは曞き蟌み、ネットワヌク通信。">I/O</abbr>を実行しないのであれば、`async def` ã®äœ¿ç”šã‚’お勧めしたす。
+
+それでも、どちらの状況でも、**FastAPI**が過去のフレヌムワヌクよりも (たたはそれに匹敵するほど) [高速になる](/#performance){.internal-link target=_blank}可胜性がありたす。
+
+### äŸå­˜é–¢ä¿‚
+
+䟝存関係に぀いおも同様です。䟝存関係が `async def` ã§ã¯ãªãæš™æº–の `def` é–¢æ•°ã§ã‚る堎合、倖郚スレッドプヌルで実行されたす。
+
+### ã‚µãƒ–䟝存関係
+
+(関数定矩のパラメヌタヌずしお) ç›žäº’に必芁な耇数の䟝存関係ずサブ䟝存関係を蚭定できたす。䞀郚は `async def` ã§äœœæˆã•れ、他の䞀郚は通垞の `def` ã§äœœæˆã•れたす。それでも動䜜し、通垞の `def`で䜜成されたものは、「awaitされる」代わりに (スレッドプヌルから) å€–郚スレッドで呌び出されたす。
+
+### ãã®ä»–のナヌティリティ関数
+
+あなたが盎接呌び出すナヌティリティ関数は通垞の `def` ãŸãŸã¯ `async def` ã§äœœæˆã§ãã€FastAPIは呌び出す方法に圱響を䞎えたせん。
+
+これは、FastAPIが呌び出す関数ず察照的です: *path operation é–¢æ•°*ず䟝存関係。
+
+ナヌティリティ関数が `def` ã‚’䜿甚した通垞の関数である堎合、スレッドプヌルではなく盎接 (コヌドで蚘述したずおりに) å‘Œã³å‡ºã•れたす。関数が `async def` ã‚’䜿甚しお䜜成されおいる堎合は、呌び出す際に `await` ã™ã‚‹å¿…芁がありたす。
+
+---
+
+繰り返しになりたすが、これらは非垞に技術的な詳现であり、怜玢しお蟿り着いた堎合は圹立぀でしょう。
+
+それ以倖の堎合は、䞊蚘のセクションのガむドラむンで問題ないはずです: <a href="#in-a-hurry">急いでいたすか</a>。
index 68ea01ab56b37b060d37607b876678232c3c8516..a85d12e2bd010323fbd6ffb2905a24878f77a263 100644 (file)
@@ -71,6 +71,7 @@ nav:
   - advanced/additional-status-codes.md
   - advanced/response-directly.md
   - advanced/custom-response.md
+- async.md
 - ãƒ‡ãƒ—ロむ:
   - deployment/index.md
   - deployment/deta.md