バックグラウンドジョブが作成されるジョブをポストする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
私はこれとまったく同じようにfastAPIを使用し、concurrent.futures.ProcessPoolExecutor()
とasyncioを組み合わせて長時間実行ジョブを管理しています。
他のモジュール(セロリなど)に依存したくない場合は、ジョブの状態を自分で管理し、どこかに保存する必要があります。サーバーの再起動後に保留中のジョブを再開できるように、それをDBに保存します。
アプリのbackground_tasks
では、CPUを集中的に使用する計算を実行しないでください。これは、リクエストを処理するのと同じ非同期イベントループで実行され、アプリが停止するためです。代わりに、それらをスレッドプールまたはプロセスプールに送信します。