ホームページ > バックエンド開発 > Python チュートリアル > FastAPI アプリケーションが同時リクエストを並列ではなく順次に処理するのはなぜですか?

FastAPI アプリケーションが同時リクエストを並列ではなく順次に処理するのはなぜですか?

Linda Hamilton
リリース: 2025-01-01 01:12:09
オリジナル
618 人が閲覧しました

Why Does My FastAPI Application Process Concurrent Requests Sequentially Instead of in Parallel?

FastAPI は並列ではなくシリアルで API 呼び出しを実行します

問題点:

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!"}
ログイン後にコピー

追加の分析情報:

  • time.sleep() などのブロック操作非同期の def エンドポイントはサーバー全体をブロックし、並列処理の利点を実現します。効果はありません。
  • CPU バウンドのタスクやブロッキング I/O 操作は、run_in_threadpool()、loop.run_in_executor()、ThreadPoolExecutor、ProcessPoolExecutor などの手法を使用して、別のスレッドまたはプロセスで実行できます。
  • ワーカー (プロセス) の数を増やすと同時実行性が向上し、より多くのリクエストに対応できるようになります
  • 大量のバックグラウンド計算の場合は、apscheduler の Celery や AsyncIOScheduler などのツールの使用を検討してください。

以上がFastAPI アプリケーションが同時リクエストを並列ではなく順次に処理するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート