🔀
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 defrequestsライブラリ →
def、httpx →async defCPU演算 →
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転換