ホームページ >バックエンド開発 >Python チュートリアル >同時対並列: FastAPI はリクエストをどのように処理しますか?

同時対並列: FastAPI はリクエストをどのように処理しますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 20:35:10135ブラウズ

Concurrent vs. Parallel: How Does FastAPI Handle Requests?

FastAPI の同時リクエストと並列リクエスト

FastAPI では、非同期 def エンドポイントが常にリクエストを実行しない理由についてよく誤解されています。平行。この動作は FastAPI の設計が原因ではなく、FastAPI が非同期プログラミングをどのように利用するかに関係しています。

def エンドポイントを使用する場合、FastAPI はそれらを別のスレッドで同期的に実行し、同時実行を可能にします。ただし、非同期 def エンドポイントは通常、イベント ループ内で直接実行され、コードが非同期 I/O 操作と対話するときに同時実行性と並列性の両方が保証されます。

FastAPI の同期コードと非同期コード

FastAPI は、async def を通じて非同期コードをサポートしており、制御を戻すことができます。 await を使用してイベント ループに接続します。この機能により、クライアントからのデータやデータベースの応答を待つなどのノンブロッキング操作が可能になります。ただし、time.sleep() などの同期タスクが非同期 def エンドポイント内で使用される場合、イベント ループがブロックされ、最終的にはサーバーがブロックされ、リクエストが順次処理されることになります。

外部スレッドプール

ブロックしているタスクがイベント ループを妨げないように、FastAPI は外部スレッドプールを使用し、def で定義されたタスクを別個に実行します。スレッドを処理し、イベント ループの実行を再開する前にスレッドを待機します。このアプローチは、真の並列化ではない場合でも、def エンドポイントの同時実行性を実現します。

ベスト プラクティス

  • 非同期操作を待機する必要があるエンドポイントには async def を使用します。
  • 対話しないエンドポイントには def を使用します非ブロッキング I/O または単純な応答を含めます。
  • Starlette の run_in_threadpool() 関数を利用して、非同期 def エンドポイントの別のスレッドでブロッキング タスクを実行します。
  • loop.run_in_executor などの asyncio メソッドの使用を検討します。 () により、同期タスクをより柔軟に実行できます。
  • バックグラウンドでの大量の計算には、Celery や AsyncIOScheduler などの外部ツールの使用を検討してください。

以上が同時対並列: FastAPI はリクエストをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。