>백엔드 개발 >파이썬 튜토리얼 >FastAPI에서 백그라운드 작업을 실행하는 방법은 무엇입니까?

FastAPI에서 백그라운드 작업을 실행하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-18 12:03:18562검색

How to Run Background Tasks in FastAPI?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.