FastAPI의 백그라운드 작업 실행
FastAPI에서 개발자는 작업과 관련 없는 기능을 백그라운드에서 실행해야 하는 시나리오에 직면할 수 있습니다. 그들의 API. 이를 달성하려면 스레딩 메커니즘을 사용해야 합니다.
해결책 1: uvicorn.run 전에 스레드 시작
한 가지 접근 방식은 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: 이벤트 스케줄러
또 다른 옵션은 반복 이벤트 스케줄러를 구현하는 것입니다. 백그라운드 작업의 경우:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!