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

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

DDD
DDD원래의
2024-12-05 15:32:10717검색

How to Efficiently Run Background Jobs in FastAPI?

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

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