Python FastAPI が同時実行性とパフォーマンスの問題を解決する方法

FastAPI は Python 3.6 以降をベースにした Web フレームワークで、使いやすく、パフォーマンスが高く、API を高速に作成できるという特徴があります。FastAPI の同時実行性とパフォーマンスの問題を解決するいくつかの方法を次に示します。

1) 非同期プログラミング

FastAPI は、asyncio ベースの非同期プログラミング モデルを使用しており、ネットワーク リクエストなどの I/O 集中型のタスクを処理する際のパフォーマンスを大幅に向上させることができます。非同期プログラミングでは、タスクが I/O 要求を開始すると、プログラムは自動的に他のタスクの実行に切り替え、I/O 結果が返されるのを待ち、その後切り替えて元のタスクの実行を継続します。
FastAPI で非同期プログラミングを実装するには、Python 3.6 以降で導入された asyncio ライブラリを使用できます。Asyncio は、イベント ループとコルーチンに基づいた非同期プログラミング モデルを提供します。タスクが I/O リクエストを開始すると、プログラムは自動的に他のタスクに切り替え、I/O 結果が返されるのを待ち、その後切り替えて元のタスクを続行します。タスク。このアプローチにより、アプリケーションのパフォーマンスとスループットが向上します。

FastAPI で非同期プログラミングを実装する方法を示すサンプル コードを次に示します。


```python
from fastapi import FastAPI
import asyncio

app = FastAPI()

async def async_task():
    await asyncio.sleep(1)
    return "Hello World"

@app.get("/")
async def root():
    response = await async_task()
    return {"message": response}

上記のコードでは、async_task という非同期タスクを作成し、await キーワードを使用してタスクの結果を待ちます。ルーティング関数では、async_task 関数を呼び出し、await を使用してタスクの実行を待ちます。

上記の例では、非同期コードを実行するには、Python に付属の asyncio.run() 関数を使用する必要があります。他のフレームワークやツール (uvicorn や Gunicorn など) と統合する必要がある場合は、アプリ オブジェクトを対応する run 関数に渡すことで非同期プログラミングを実装できます。

FastAPI では、asyncpg、aioredis、aiohttp などの他の非同期ライブラリも使用できます。これらのライブラリは、非同期データベース アクセス、キャッシュ アクセス、HTTP クライアント、その他の機能を提供し、FastAPI と組み合わせて使用​​することで、より効率的な非同期プログラミングを実現できます。

asyncpg と FastAPI を使用した非同期データベース操作の例を次に示します。

python
import asyncpg
from fastapi import FastAPI

app = FastAPI()

async def connect_to_db():
    pool = await asyncpg.create_pool(
        host="localhost",
        database="mydatabase",
        user="myuser",
        password="mypassword"
    )
    return pool

async def get_db():
    return await connect_to_db()

@app.get("/")
async def root():
    db = await get_db()
    result = await db.fetch("SELECT * FROM mytable")
    return {
    
    "result": result}
在上面的代码中,我们首先

2 つの非同期関数 connect_to_db と get_db が定義されています。connect_to_db はデータベースへの接続に使用され、get_db はデータベースの接続プールを返します。次に、ルーティング関数で、get_db 関数を使用してデータベース接続プールを取得し、await キーワードを使用してフェッチ関数がクエリ操作を実行するのを待ちます。

それだけでなく、FastAPI 自体も非同期プログラミングをサポートしており、非同期 API インターフェイスを作成し、非同期タスクの同時処理を処理できるコルーチンのサポートが組み込まれています。たとえば、FastAPI のルーティング関数で非同期 Python 関数を使用して非同期プログラミングを実装すると、アプリケーションのパフォーマンスとスループットが向上します。
非同期プログラミングでは、非同期プログラミングの利点を最大限に活用するために、ブロッキング操作の使用をできるだけ避ける必要があることに注意してください。FastAPI の構造と設計概念は非同期プログラミングに非常に適しており、開発者は非同期プログラミングを簡単に使用して効率的で高速な API インターフェイスを実装できます。
要約すると、非同期プログラミングは、FastAPI が I/O 集約型のタスク (ネットワーク リクエストなど) を処理するための効果的な方法であり、アプリケーションのパフォーマンスとスループットを大幅に向上させることができます。非同期プログラミングは、asyncio ライブラリを使用して簡単に実装でき、非同期プログラミングは FastAPI の API インターフェイスと簡単に統合することもできます。

2) Gunicorn の展開または uvicorn の展開

ガニコーン vs ユビコーン

Gunicorn と uvicorn はどちらも Python Web サーバーですが、いくつかの重要な点で異なります。

まず、Gunicorn は、プリフォーク モデルを使用するマルチプロセス非同期サーバーです。ワーカー プロセスを使用して受信リクエストを処理し、リバース プロキシをロード バランサとして使用します。Gunicorn は、gthread、sync、gevent、eventlet、tornado などのさまざまなワーカー プロセス タイプをサポートしており、特定の状況に応じてさまざまなワーカー タイプを選択できます。ただし、Gunicorn は非同期 I/O をネイティブにサポートしていないため、I/O 集中型のワークロードでは最適なパフォーマンスが得られない可能性があります。

uvicorn は、asyncio ライブラリをベースにした非同期 Web サーバーです。HTTP/1.1 および HTTP/2 プロトコルをサポートし、非同期 I/O を使用してリクエストを処理し、多数の同時接続を処理できます。非同期 I/O のおかげで、uvicorn は I/O 集中型のワークロードに適しており、待ち時間の短縮とスループットの向上を実現できます。さらに、uvicorn は asyncio ライブラリによって提供される非同期パフォーマンスの利点を最大限に活用できるため、FastAPI や ASGI などの非同期フレームワークとプロトコルをサポートします。

要約すると、Gunicorn は CPU 集中型のワークロードに適しており、uvicorn は I/O 集中型のワークロードに適しています。アプリケーションが非同期フレームワークを使用している場合、または多数の同時接続を処理する必要がある場合は、uvicorn を使用することをお勧めします。アプリケーションが CPU 集中型のワークロードを処理する必要がある場合は、Gunicorn の使用を検討してください。

ユビコーンは使用します

Uvicorn を使用して Web アプリケーションをデプロイするには、通常、次の手順が必要です。

1) Uvicorn およびアプリケーション依存ライブラリのインストール
pip コマンドを使用して、Uvicorn およびアプリケーション依存ライブラリをインストールできます。たとえば、次のコマンドを使用して Uvicorn ライブラリと FastAPI ライブラリをインストールします。

pip install uvicorn fastapi

2) Uvicorn サーバーを起動します。
次のコマンドを使用して Uvicorn サーバーを起動できます。

uvicorn app:app --host 0.0.0.0 --port 8000

このうち、app:app はアプリケーションプログラム名とインスタンスオブジェクトの変数名を表し、--host と --port はそれぞれバインドされた IP アドレスとポート番号を表します。さらに、Uvicorn は、 --workers でワーカー プロセスの数を指定したり、 --log-level でログ レベルを設定したりするなど、他の多くのコマンド ライン オプションも提供します。

3) リバース プロキシ サーバーの構成
HTTPS またはロード バランシングをサポートするために、Uvicorn とクライアント (Nginx、Apache、AWS ELB など) の間にリバース プロキシ サーバーを追加できます。リバース プロキシ サーバーを使用すると、SSL 終端、キャッシュ、負荷分散、フロー制御などの機能を実装して、可用性とパフォーマンスを向上させることができます。

Uvicorn のパフォーマンスと同時処理機能を向上させるには、次の措置を講じることができます。
1. ワーカーの数を調整する
デフォルトでは、Uvicorn はワーカー プロセスを使用してリクエストを処理します。ただし、 --workers オプションを使用して複数のワーカー プロセスを指定すると、同時処理を増やすことができます。システム リソースの過剰な消費によるパフォーマンスの低下を避けるために、CPU コアの数とメモリ容量に応じて適切なワーカー数を選択してください。

2. ワーカー タイプを設定します。
Uvicorn はデフォルトでイベント ルーパーとして uvloop を使用しますが、非同期キーワードで他のイベント ルーパーもサポートします。さらに、 --http オプションを使用して、標準ライブラリの Uvicorn や asyncio に付属する httptools などの HTTP プロトコル実装を指定することもできます。最高のパフォーマンスとスケーラビリティを実現するために、特定のニーズに基づいて適切なイベント ルーパーとプロトコル実装を選択します。

3. 非同期フレームワークを有効にする
Uvicorn は、FastAPI、Starlette、Quart などのさまざまな非同期 Web フレームワークをサポートします。これらのフレームワークは、Uvicorn の非同期 I/O 機能を利用して、パフォーマンスと応答性をさらに向上させることができます。I/O 集中型のワークロードを処理し、非同期フレームワークを使用して作成されたアプリケーションは、Uvicorn を最大限に活用できます。

4. キャッシュと圧縮を有効にする
アプリケーションの負荷を軽減し、パフォーマンスを向上させるために、キャッシュと圧縮を有効にすることができます。たとえば、Cache-Control ヘッダーを使用して静的ファイルのキャッシュ ポリシーを設定したり、gzip を使用して動的に生成されたコンテンツを圧縮したりできます。これらの技術により、ネットワークの送信と処理時間が短縮され、Web アプリケーションのパフォーマンスが向上します。

要約すると、Uvicorn を使用して Web アプリケーションをデプロイする場合は、ワーカーの数を調整し、ワーカー タイプを構成し、最高のパフォーマンスと同時処理機能を得るために非同期フレームワークを有効にすることに注意する必要があります。同時に、キャッシュや圧縮などの技術を有効にすると、アプリケーションのパフォーマンスと応答性がさらに向上します。

上記の最適化手法に加えて、Uvicorn のパフォーマンスと可用性を向上させるために使用できる手法やツールがいくつかあります。 1. 非同期タスク キューの導入 非同期で実行する必要がある多数の
タスク
用、パフォーマンスを最適化するために、非同期タスク キューの使用を検討できます。たとえば、Celery や RQ などのツールを使用してバックグラウンド タスクを処理し、結果をクライアントに返すことができます。これにより、Web アプリケーションの処理ロジックとバックグラウンド タスクを効果的に分離できるため、システムの拡張性と保守性が向上します。

2. HTTP/2 プロトコルを有効にする
HTTP/2 は、Web アプリケーションのパフォーマンスと応答速度を大幅に向上させることができるバイナリ プロトコルです。HTTP/2プロトコルを有効にすることで、多重化、ヘッダー圧縮、サーバープッシュなどの機能を実現でき、ネットワーク伝送や処理時間を短縮できます。HTTP/2 プロトコルを有効にするには、Uvicorn で SSL/TLS 証明書を構成し、--http オプションを h2 に設定する必要があります。

3. 非同期データベース ドライバーを使用する
データベースと対話する必要があるアプリケーションの場合、非同期データベース ドライバーを使用して、クエリおよび書き込み操作を高速化できます。たとえば、PostgreSQL データベースの場合、asyncpg や SQLAlchemy-Async などの非同期ドライバーを使用できます。これらのドライバーは、Python の非同期 I/O ライブラリと Uvicorn の非同期の性質を利用することができ、その結果、データベース操作が高速化され、同時処理能力が向上します。

4. 統合された監視ツールとデバッグ ツール
Web アプリケーションの安定性と可用性を確保するために、監視ツールとデバッグ ツールを統合してパフォーマンス インジケーターとエラーを追跡できます。たとえば、Prometheus や Grafana などのツールを使用してアプリケーション メトリックを収集および視覚化でき、Sentry や ELK などのツールを使用してエラー ログを記録および分析できます。これらのツールは、開発者が問題を迅速に特定し、システム パフォーマンスを最適化するのに役立ちます。

要約すると、非同期タスク キューなどのテクノロジーを導入し、HTTP/2 プロトコルを有効にし、非同期データベース ドライバーと統合された監視およびデバッグ ツールを使用することにより、Uvicorn サーバーのパフォーマンス、スケーラビリティ、および可用性をさらに向上させ、さまざまな種類のアプリケーションのニーズを満たすことができます。

3) キャッシュ

FastAPI には組み込みのキャッシュ関数があり、デコレータ @cache() を追加することでインターフェイス用にキャッシュできます。リクエストが頻繁に発生するシナリオでは、キャッシュを使用するとデータベースなどのリソースへのアクセス数が減り、パフォーマンスが向上します。

4) データベース接続プール

FastAPI は SQLAlchemy 接続プールを使用して、データベース接続の頻繁な作成と破棄を回避できます。接続プールは起動時に一定数のデータベース接続を作成し、必要に応じてリクエストに接続を割り当てます。リクエストが終了すると、接続は接続プールに解放されます。接続プールを使用すると、頻繁に接続を作成および破棄するオーバーヘッドを回避できるため、パフォーマンスが向上します。

5) 分散展開

単一の FastAPI インスタンスでは高い同時実行要件を満たせない場合は、分散デプロイメントを検討できます。ロード バランサー (Nginx、HAProxy など) は、リクエストを複数の FastAPI インスタンスに分散するように構成でき、各インスタンスはリクエストを独立して処理できるため、同時処理機能が向上します。

6) Pydantic の使用

FastAPI は Pydantic ライブラリを使用してリクエスト パラメーターと応答データを処理し、多数の型変換と検証において、Pydantic はパフォーマンスを最適化します。データ検証に Pydantic を使用する場合、Pydantic は C 型と同じレベルで Python 型を使用し、型推論には Python 3.6 以降で提供されるデータ構造 (型注釈など) を使用します。これにより、明示的な型変換プロセスが削減され、パフォーマンスが向上します。

7) コードの最適化とキャッシュ

API インターフェイスの実行速度を最適化することが、FastAPI のパフォーマンスを向上させる鍵となります。一般的な最適化には次のようなものがあります。

  • データベースクエリの数を減らす、より効率的なアルゴリズムを使用するなど、ボトルネック部分のコードを最適化します。
  • 結果はキャッシュされ、定期的に更新されます。結果をリアルタイムで更新する必要がない場合は、結果をキャッシュしてデータベースやその他のリソースへの負担を軽減できます。
  • 効率を向上させるには、asyncio や gevent などのライブラリを使用するなど、非同期プログラミング手法を使用します。

8) GZip圧縮を有効にする

GZip 圧縮を有効にすると、送信されるデータの量が削減され、ネットワーク送信の効率が向上します。FastAPI は、リクエスト ヘッダーに Accept-Encoding: gzip, deflate を追加することで GZip 圧縮を有効にできます。

9) CDN を使用して高速化する

FastAPI を使用するプロセスでは、CDN (Content Delivery Network、コンテンツ配信ネットワーク) を使用して静的ファイル (画像、CSS ファイル、JavaScript ファイルなど) をユーザーの近くにキャッシュし、静的リソースへのアクセスを高速化できます。

10) ログ記録および監視ツールを使用する

ログ ツールと監視ツールを使用すると、アプリケーションの実行ステータスをより深く理解し、問題を時間内に発見して解決することができます。FastAPI は、ELK、Sentry、Prometheus などの多くのロギングおよび監視ツールと統合でき、ロギング、エラー追跡、パフォーマンス監視を簡単に実行できます。

要約すると、FastAPI は、非同期プログラミング、Gunicorn または uvicorn のデプロイメント、キャッシュ、データベース接続プール、分散デプロイメント、Pydantic ライブラリ、コードの最適化とキャッシュ、GZip 圧縮の有効化、CDN アクセラレーションの使用、使用法など、同時実行性とパフォーマンスの問題を解決するための多くの方法を提供します。ロギングおよびモニタリングツールなど アプリケーションのパフォーマンスとスケーラビリティを向上させるには、特定のシナリオやニーズに応じて最適な最適化方法を選択する必要があります。

おすすめ

転載: blog.csdn.net/stark_summer/article/details/130797927