FastAPI のバックグラウンド ジョブ: 関数の非同期実行
FastAPI では、ブロックすべきでない非同期操作を実行する場合にバックグラウンド関数が必要です。または、メインの API 操作を遅らせます。バックグラウンド ジョブを効果的に設定する方法を見てみましょう。
1.スレッドベースのバックグラウンド タスク:
スレッドの開始は、バックグラウンドで関数を実行する簡単な方法です:
def start_worker(): print('[main]: starting worker...') my_worker = worker.Worker() my_worker.working_loop() # this function prints "hello" every 5 seconds if __name__ == '__main__': print('[main]: starting...') uvicorn.run(app, host="0.0.0.0", port=8000, reload=True) _worker_thread = Thread(target=start_worker, daemon=False) _worker_thread.start()
ただし、このアプローチには制限があります。メイン スレッドがブロックされるためです。実行の。これを回避するには、以下に示すように、メイン API プロセスの前にスレッドを開始します。
_worker_thread.start() uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
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。 AsyncIO バックグラウンド タスク:
バックグラウンド関数が非同期の場合、asyncio.create_task() 関数を使用できます:
from fastapi import FastAPI from contextlib import asynccontextmanager import asyncio async def print_task(s): while True: print('Hello') await asyncio.sleep(s) @asynccontextmanager async def lifespan(app: FastAPI): # Run at startup asyncio.create_task(print_task(5)) yield # Run on shutdown (if required) print('Shutting down...') app = FastAPI(lifespan=lifespan)
以上がFastAPI でバックグラウンド ジョブを効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。