FastAPI は API 呼び出しを並列ではなく直列で実行します
Q: FastAPI API 呼び出しは並列ではなく直列で実行されるのはなぜですか?
A: FastAPI のドキュメントによると、使用する場合、 async def の代わりに def を使用してパス操作関数を定義すると、直接呼び出されるのではなく、待機される外部スレッド プールで実行されます。これは、サーバーのブロックを防ぐために行われます。
並列実行に関する追加の考慮事項:
非同期 def と def エンドポイント:
-
async def: 関数イベントループ内で直接実行します。非ブロッキング I/O バインド操作を待機している限り、同時に処理されます。
-
def: 関数は、外部スレッド プールとは別のスレッドで実行されます。イベント ループの外で実行されない限り、シリアルに処理されます。
ブロック操作の使用:
非同期 def エンドポイントにブロック操作が含まれており、待機しない場合完了すると、イベント ループがブロックされ、リクエストが処理されます。
解決策:
- 非同期 def ではなく通常の def を使用してエンドポイントを定義します (待機可能な操作がない場合)。
- FastAPI の run_in_threadpool() 関数を使用して、ブロッキング タスクを別個に実行します。 thread.
- asyncio のloop.run_in_executor() または asyncio.to_thread() を使用して、別のエグゼキュータまたはスレッドでブロッキング タスクを実行します。
その他の最適化戦略:
- より多くのワーカーを使用して、マルチコア CPU。
- 大量のバックグラウンド計算には Celery または AsyncIOScheduler の使用を検討してください。
以上がFastAPI が API 呼び出しを並列ではなく逐次実行するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。