nikkie-ftnextの日記

イベントレポートや読書メモを発信

#pyconjp2024 トークメモ「FastAPIでのasync defとdefの使い分け」

はじめに

うさちゃんに、なりたい。。 nikkieです。

PyCon JP 2024のインプットを、自分の理解を深めるために記事にしていきます。

目次

ミニトーク「FastAPIでのasync defとdefの使い分け」

15分のミニトーク
https://2024.pycon.jp/ja/talk/H9EWWL

自分では説明できないので聞きに行きました。

完全理解! awaitするならasync def、awaitしないならdef

  • defはマルチスレッド
  • async defシングルスレッド
    • イベントループによる並行処理(async/await

def+awaitなし」と「async def+awaitなし」とパフォーマンス検証もされています(slide=23)。
async def+awaitなしは遅いと示されています

一緒に聞いた方のつぶやきも当日の理解の参考になりました。

IMO 合わせて読みたい、FastAPI公式ドキュメント

FastAPIのドキュメントも合わせて読んでしっくり来ました1

日本語ではこちらの箇所(In a hurry? の TL;DR:)
急いでいますか?

await を使用して呼び出すべきサードパーティライブラリを使用している場合:
async def を使用してpath operation 関数を宣言します。

await の使用をサポートしていないサードパーティライブラリ (略) を使用している場合、次の様に、単に def を使用して通常通り path operation 関数 を宣言してください:

ミニトークで実行される際のスレッドを知った身には、これで完全理解です!

続くのが

アプリケーションが (どういうわけか) 他の何とも通信せず、応答を待つ必要がない場合は、async def を使用して下さい。

これはどういう意味なんだろう?2
通信しないならシングルスレッドで十分ということなんでしょうか?(私がなにか読み落としている?)

よく分からない場合は、通常の def を使用して下さい。

とにかく、上記のいずれの場合でもFastAPIは非同期で動作し、非常に高速です。
しかし、上記のステップに従うことで、パフォーマンスの最適化を行えます。

ここは理解しきれていないです。
トークやそこからの理解と矛盾するような? TODO 宿題として原文確認しよう)

勝手に補足:「並列処理・並行処理・非同期処理」について

こちらのスライド、私も同様に感じたので調べてみます。
結論としては、『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とdefの使い分け」、発表ありがとうございました!
FastAPIでasync defdefをどう使い分けるのか説明できなかったので、このトークで知れてよかったです!

  • async defはシングルスレッド。awaitがあるときに限って使う
    • awaitがないasync defはシングルスレッドのために遅くなるので避ける
  • defはマルチスレッド。awaitがないときに使う

「並列処理・並行処理・非同期処理」については3つのいずれかに分類されるのではなく、以下と思われます。

  • 非同期処理=並行処理
  • 並行処理には以下がある
    • マルチスレッド
    • イベントループ
    • マルチプロセス(=並列処理)

  1. emojiいっぱいで楽しいドキュメントです
  2. awaitdefの中には書けない(SyntaxError: 'await' outside async function)ので、「async def + awaitあり」「async def + awaitなし」「def + awaitなし」の3パターンですね
  3. 過去に学んでいます。8/18(木)のみんなのPython勉強会 #stapy 非同期処理特集に向けて asyncio を予習するのです - nikkie-ftnextの日記