Hintergrundjobs in FastAPI: Funktionen asynchron ausführen
In FastAPI sind Hintergrundfunktionen erforderlich, wenn Sie asynchrone Vorgänge ausführen möchten, die nicht blockieren sollen oder die Haupt-API-Operationen verzögern. Lassen Sie uns untersuchen, wie Sie Hintergrundjobs effektiv einrichten.
1. Thread-basierte Hintergrundaufgaben:
Das Starten von Threads ist eine einfache Möglichkeit, Funktionen im Hintergrund auszuführen:
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()
Dieser Ansatz hat jedoch eine Einschränkung: Er blockiert den Haupt-Thread der Ausführung. Um dies zu vermeiden, starten Sie Ihren Thread vor dem Haupt-API-Prozess, wie unten gezeigt:
_worker_thread.start() uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
2. Ereignisbasierte Hintergrundaufgaben:
Eine weitere Option ist die Verwendung ereignisbasierter Planer:
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-Hintergrundaufgaben:
Wenn Ihre Hintergrundfunktion asynchron ist, können Sie die Funktion asyncio.create_task() verwenden:
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)
Das obige ist der detaillierte Inhalt vonWie kann man Hintergrundjobs in FastAPI effizient ausführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!