問題点:
FastAPI は並列機能を提供しますが、API複数のブラウザ タブを通じて同時に行われた呼び出しは、並列ではなく順次処理されます。この現象は、エンドポイントが async def ではなく def で定義されている場合に発生します。
分析と解決策:
FastAPI は、外部スレッドプールを利用して、def で定義されたエンドポイントを処理します。このようなエンドポイントがリクエストを受信すると、FastAPI はスレッドプールとは別のスレッドでリクエストを実行します。ただし、一度に処理できるリクエストは 1 つだけであるため、真の並列処理ではなく、順次リクエスト処理が行われます。
対照的に、async def で定義されたエンドポイントはメイン イベント ループで直接実行され、真の並列リクエスト処理が可能になります。 。これは、非同期 def エンドポイント内の await 呼び出しが、非同期操作の待機中にイベント ループ内の他のタスクに優先されるためです。
この問題を解決するには、I/O バウンド操作のブロックを必要としないエンドポイントが定義されていることを確認してください。 async def を使用して、FastAPI の並列機能を活用します。並列実行できるエンドポイントの例を次に示します。
@app.get("/ping") async def ping(request: Request): print("Hello") await asyncio.sleep(5) print("bye") return {"ping": "pong!"}
追加の分析情報:
以上がFastAPI アプリケーションが同時リクエストを並列ではなく順次に処理するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。