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. 이벤트 기반 백그라운드 작업:
또 다른 옵션은 이벤트 기반 스케줄러를 사용하는 것입니다:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!