🔀

FastAPIのasync/await — defとasync defの違い

async defを使うと速くなる?場合による

FastAPIでこの2つは動作が全く異なる。

def(通常関数)

FastAPIが自動的にrun_in_executor()でスレッドプールで実行。ブロッキングI/Oを使ってもイベントループが止まらない。

async def

イベントループで直接実行。awaitなしでブロッキングコードを書くとサーバー全体が止まる。 最も多い間違い。

どちらをいつ使うか

  • 同期DB(SQLAlchemy sync)→ def

  • 非同期DB(asyncpg, motor)→ async def

  • requestsライブラリ → def、httpx → async def

  • CPU演算 → def(GILのためasyncは意味なし)

キーポイント

1

def → FastAPIがスレッドプールで実行(ブロッキングI/O OK)

2

async def → イベントループで実行(必ずawait使用)

3

async defでブロッキングコード(requests.get等)はサーバー全体停止

4

確信がなければdefを使う — FastAPIがスレッドプール処理を自動で

ユースケース

外部API呼び出しが多いサーバー — async + httpxで同時リクエスト処理 既存同期コードマイグレーション — defで開始、段階的にasync転換