はじめに
うさちゃんに、なりたい。。 nikkieです。
PyCon JP 2024のインプットを、自分の理解を深めるために記事にしていきます。
目次
- はじめに
- 目次
- ミニトーク「FastAPIでのasync defとdefの使い分け」
- 完全理解! awaitするならasync def、awaitしないならdef
- IMO 合わせて読みたい、FastAPI公式ドキュメント
- 勝手に補足:「並列処理・並行処理・非同期処理」について
- 私の宿題事項
- 終わりに
ミニトーク「FastAPIでのasync defとdefの使い分け」
15分のミニトーク
https://2024.pycon.jp/ja/talk/H9EWWL
先程の発表資料です。(ハッシュタグ間違えてた)https://t.co/dU2sMyDwuW#pyconjp2024
— Takashi Sasaki (@Ssk1029Takashi) 2024年9月27日
自分では説明できないので聞きに行きました。
完全理解! awaitするならasync def、awaitしないならdef
ドキュメントやつぶやき見て、私が間違ってるかもですが
— nikkie / にっきー (@ftnext) 2024年9月27日
・awaitするならasync def
→シングルスレッド
・awaitしないならdef
→マルチスレッド
async defでawaitしてないとシングルスレッドになるので遅くなることが発表で示されていた!https://t.co/C6jw1gzmMU
#pyconjp_1
def
はマルチスレッドasync def
はシングルスレッド- イベントループによる並行処理(
async
/await
)
- イベントループによる並行処理(
「def
+await
なし」と「async def
+await
なし」とパフォーマンス検証もされています(slide=23)。
async def
+await
なしは遅いと示されています
一緒に聞いた方のつぶやきも当日の理解の参考になりました。
> FastAPIのdef はマルチスレッド
— skokado (@_skokado) 2024年9月27日
知らなかった。 #pyconjp_1 #pyconjp2024
「async def な Path Operation のなかで同期処理をするとシングルスレッドの同期処理になってしまう」
— hoto (@hoto17296) 2024年9月27日
それは本当にそう〜
意識しないとやらかす#pyconjp2024 #pyconjp_1
async defの中で同期処理を行うとパフォーマンスに大きく影響が出るので、
— くまぴ (@kumappp27) 2024年9月27日
同期処理を行う場合はdefの中で行う
FastAPIのdefはマルチスレッドで処理されるので、同期処理はこちらのほうがパフォーマンスが大分高い#pyconjp_1
IMO 合わせて読みたい、FastAPI公式ドキュメント
FastAPIのドキュメントも合わせて読んでしっくり来ました1。
日本語ではこちらの箇所(In a hurry? の TL;DR:)
急いでいますか?
await
を使用して呼び出すべきサードパーティライブラリを使用している場合:
async def
を使用してpath operation 関数を宣言します。
await
の使用をサポートしていないサードパーティライブラリ (略) を使用している場合、次の様に、単にdef
を使用して通常通り path operation 関数 を宣言してください:
ミニトークで実行される際のスレッドを知った身には、これで完全理解です!
続くのが
アプリケーションが (どういうわけか) 他の何とも通信せず、応答を待つ必要がない場合は、
async def
を使用して下さい。
これはどういう意味なんだろう?2
通信しないならシングルスレッドで十分ということなんでしょうか?(私がなにか読み落としている?)
よく分からない場合は、通常の
def
を使用して下さい。とにかく、上記のいずれの場合でもFastAPIは非同期で動作し、非常に高速です。
しかし、上記のステップに従うことで、パフォーマンスの最適化を行えます。
ここは理解しきれていないです。
(トークやそこからの理解と矛盾するような? TODO 宿題として原文確認しよう)
勝手に補足:「並列処理・並行処理・非同期処理」について
「非同期処理」はマルチプロセスもマルチスレッドも内包していると思っていたけど、どうなんだっけ#pyconjp2024 #pyconjp_1
— hoto (@hoto17296) 2024年9月27日
こちらのスライド、私も同様に感じたので調べてみます。
結論としては、『Python実践入門』を引いた3ところ、発表者の方に誤解があるのではないかと思われます
本章では、Pythonで並行処理を実現するための選択肢として、マルチスレッドを使う方法、マルチプロセスを使う方法、イベントループを使う方法の3つの方法を説明します。(Kindle版 10章)
- 並行処理 (Concurrent processing)
- マルチスレッド
- イベントループ (
async
/await
)(シングルスレッド)
- 並列処理 (Parallel processing)
- マルチコアでマルチプロセス
- 並列処理は並行処理だが、並行処理だからといって並列処理とは限らない
呼び出し元と呼び出し先が同時に処理を実行しているため、非同期処理を利用しているときには、並行処理になっていると言えます。(Kindle版 10.1)
私の理解:「並列処理・並行処理・非同期処理」の3つのいずれかには分類できない
- 非同期処理=並行処理
- 並行処理には以下がある
- マルチスレッド
- イベントループ
- マルチプロセス(=並列処理)
私の宿題事項
(1) なぜマルチスレッドやシングルスレッドになるのか?
積ん読です https://fastapi.tiangolo.com/async/#very-technical-details
(2) ほぼろさんと福田さんが会話してるこのスレッド、分かるようになりたい〜
現状、何のこと言ってるかちんぷんかんぷんです
質問が出ていた「FastAPIでasync defで定義したパスオペレーション関数内でrun_in_executor()が使えるかどうか?」は普通に使えますね。自分もboto3動かしたりで使ってます。#pyconjp2024 #pyconjp_1
— ほぼろ (@rhoboro) 2024年9月27日
終わりに
ミニトーク「FastAPIでのasync defとdefの使い分け」、発表ありがとうございました!
FastAPIでasync def
とdef
をどう使い分けるのか説明できなかったので、このトークで知れてよかったです!
async def
はシングルスレッド。await
があるときに限って使うawait
がないasync def
はシングルスレッドのために遅くなるので避ける
def
はマルチスレッド。await
がないときに使う
「並列処理・並行処理・非同期処理」については3つのいずれかに分類されるのではなく、以下と思われます。
- 非同期処理=並行処理
- 並行処理には以下がある
- マルチスレッド
- イベントループ
- マルチプロセス(=並列処理)
- emojiいっぱいで楽しいドキュメントです↩
-
await
はdef
の中には書けない(SyntaxError: 'await' outside async function)ので、「async def
+await
あり」「async def
+await
なし」「def
+await
なし」の3パターンですね↩ - 過去に学んでいます。8/18(木)のみんなのPython勉強会 #stapy 非同期処理特集に向けて asyncio を予習するのです - nikkie-ftnextの日記↩