FastAPI でのバックグラウンド タスクの実行
FastAPI では、開発者は、バックグラウンドで関数を実行する必要があるシナリオに遭遇することがあります。彼らのAPI。これを実現するには、スレッド メカニズムを採用する必要があります。
解決策 1: uvicorn.run の前にスレッドを開始する
1 つの方法では、uvicorn.run を呼び出す前にスレッドを開始します。 uvicorn.run がスレッドをブロックするためです。このアプローチは次のように実装できます:
import time import threading from fastapi import FastAPI import uvicorn app = FastAPI() class BackgroundTasks(threading.Thread): def run(self,*args,**kwargs): while True: print('Hello') time.sleep(5) if __name__ == '__main__': t = BackgroundTasks() t.start() uvicorn.run(app, host="0.0.0.0", port=8000)
あるいは、開発者は FastAPI の起動イベントを利用して、アプリケーションの開始前にスレッドを開始できます:
@app.on_event("startup") async def startup_event(): t = BackgroundTasks() t.start()
解決策 2: イベントスケジューラ
もう 1 つのオプションは、定期的なイベント スケジューラを実装することです。バックグラウンド タスクの場合:
import sched, time from threading import Thread from fastapi import FastAPI import uvicorn app = FastAPI() s = sched.scheduler(time.time, time.sleep) def print_event(sc): print("Hello") sc.enter(5, 1, print_event, (sc,)) def start_scheduler(): s.enter(5, 1, print_event, (s,)) s.run() @app.on_event("startup") async def startup_event(): thread = Thread(target=start_scheduler) thread.start() if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port=8000)
解決策 3: イベント ループの使用
非同期バックグラウンド タスク (async def 関数) の場合、開発者は現在のイベント ループを利用できます。 asyncio.create_task() 関数を使用:
from asyncio import create_task from fastapi import FastAPI app = FastAPI() @app.on_event("startup") async def startup_task(): await create_task(print_task(5))
このアプローチでは、イベント ループは、uvicorn サーバーの起動時に作成されます。
以上がFastAPI でバックグラウンド タスクを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。