fastapi(21)-バックグラウンドタスク

7492 ワード

responseに戻った後、バックグラウンドタスクを実行できます.これは、リクエスト後に必要な操作に役立ちますが、クライアントは、実際には応答を受信する前に操作の完了を待つ必要はありません.たとえば、次のようなものがあります.
  • 操作後に送信された電子メール通知:
  • Eメールサーバに接続してEメールを送信するプロセスは通常遅い(数秒)ため、すぐに応答に戻り、バックグラウンドでEメール通知を送信できます.

  • 処理データ:
  • 例えば、受信したファイルがゆっくりと処理されなければならないと仮定すると、「承認済み」(HTTP 202)応答に戻り、バックグラウンドで処理できます.BackgroundTasks
  • の使用
    from fastapi import BackgroundTasks, FastAPI
    
    app = FastAPI()
    
    
    def write_notification(email: str, message=""):
        with open("log.txt", mode="w") as email_file:
            content = f"notification for {email}: {message}"
            email_file.write(content)
    
    
    @app.post("/send-notification/{email}")
    async def send_notification(email: str, background_tasks: BackgroundTasks):
        background_tasks.add_task(write_notification, email, message="some notification")
        return {"message": "Notification sent in the background"}
    

    .add_task()は、パラメータとして受信されます.
  • バックグラウンドで実行されるタスク機能(write_notification)
  • は、タスク関数の任意のパラメータシーケンスに順次(email)渡されるべきである.
  • は、タスク関数(message=「some notification」)のすべてのキーワードパラメータに渡すべきである.依存注入BackgroundTasksを使用すると、依存注入システムとともに使用することもできます.BackgroundTasksでは、パス操作関数で依存項目(依存可能)、サブ依存項目など、複数のレベルでタイプのパラメータを宣言できます.
  • from fastapi import BackgroundTasks, Depends, FastAPI
    
    app = FastAPI()
    
    
    def write_log(message: str):
        with open("log.txt", mode="a") as log:
            log.write(message)
    
    
    def get_query(background_tasks: BackgroundTasks, q: str = None):
        if q:
            message = f"found query: {q}
    "
    background_tasks.add_task(write_log, message) return q @app.post("/send-notification/{email}") async def send_notification( email: str, background_tasks: BackgroundTasks, q: str = Depends(get_query) ): message = f"message to {email}
    "
    background_tasks.add_task(write_log, message) return {"message": "Message sent"}

    警告同じプロセスで実行する必要がなく、バックグラウンド計算を大量に実行する必要がある場合(メモリ、変数などを共有する必要がない場合)、celeryなどの他のより大きなツールの使用に役立つ可能性があります.
    RabbitMQやRedisなどのメッセージ/ジョブキューマネージャなど、より複雑な構成が必要になりがちですが、複数のプロセス(特に複数のサーバ)でバックグラウンド・タスクを実行できます.
    例を表示するには、すでに構成されているCeleryを含むProject Generatorsを確認します.
    ただし、同じFastAPIから変数とオブジェクトへのアクセスを適用する必要がある場合や、電子メール通知などの小さなバックグラウンドタスクを実行する必要がある場合は、BackgroundTasksを使用するだけです.