web-dev-qa-db-ja.com

FastAPIのバックグラウンドタスクから戻りステータスを取得する

バックグラウンドジョブが作成されるジョブをポストするAPIがあり、別のGET APIでジョブのステータスを送信したい。これを達成する方法は? background_work()関数では、内部でsubprocess.call()呼び出しをターゲットとして呼び出すため、マルチプロセッシングを行います。

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def background_work(data: str):
    # some computation on data and return it
    return status

@app.post("/post_job", status_code=HTTP_201_CREATED)
async def send_notification(data: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(background_work, data)
    return {"message": "Job Created, check status after some time!"}

@app.get("/get_status")
def status():
    #how to return status of job submitted to background task

3
user user12

私はこれとまったく同じようにfastAPIを使用し、concurrent.futures.ProcessPoolExecutor()とasyncioを組み合わせて長時間実行ジョブを管理しています。

他のモジュール(セロリなど)に依存したくない場合は、ジョブの状態を自分で管理し、どこかに保存する必要があります。サーバーの再起動後に保留中のジョブを再開できるように、それをDBに保存します。

アプリのbackground_tasksでは、CPUを集中的に使用する計算を実行しないでください。これは、リクエストを処理するのと同じ非同期イベントループで実行され、アプリが停止するためです。代わりに、それらをスレッドプールまたはプロセスプールに送信します。

0
Loki