Heim > Backend-Entwicklung > Python-Tutorial > Wie kann man Hintergrundjobs in FastAPI effizient ausführen?

Wie kann man Hintergrundjobs in FastAPI effizient ausführen?

DDD
Freigeben: 2024-12-05 15:32:10
Original
717 Leute haben es durchsucht

How to Efficiently Run Background Jobs in FastAPI?

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()
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage