[python] FastAPI에서 백그라운드 작업 예약하기

FastAPI는 빠르고 간편한 웹 프레임워크로써, 비동기 작업을 지원합니다. 이를 활용하여 백그라운드 작업을 예약하고 실행하는 방법을 알아보겠습니다.

1. BackgroundTasks를 이용한 작업 예약

FastAPI에서 백그라운드 작업을 예약하려면, BackgroundTasks 객체를 사용해야 합니다. 이 객체를 사용하면 HTTP 응답 전에 작업을 예약할 수 있습니다.

아래는 BackgroundTasks를 이용하여 백그라운드 작업을 예약하는 간단한 예제입니다.

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def my_background_task():
    # 백그라운드 작업 로직 구현
    print("백그라운드 작업 실행")

@app.post("/task/")
async def create_task(background_tasks: BackgroundTasks):
    # 백그라운드 작업 예약
    background_tasks.add_task(my_background_task)
    return {"message": "백그라운드 작업 예약 완료"}

위 코드에서 my_background_task() 함수는 백그라운드에서 실행되는 작업 로직입니다. create_task() 함수는 HTTP POST 메서드로 요청이 들어올 때 백그라운드 작업을 예약하는 엔드포인트입니다. BackgroundTasks 객체를 이용하여 my_background_task() 함수를 예약하고, “백그라운드 작업 예약 완료” 메시지를 반환합니다.

2. 비동기 작업 실행

위 예제에서는 백그라운드 작업 함수를 동기적으로 실행했습니다. 하지만 FastAPI는 비동기 프레임워크이기 때문에, 작업 함수를 비동기로 실행할 수도 있습니다. 이를 위해 async 키워드를 사용하여 비동기 작업 함수를 정의합니다.

@app.post("/task/")
async def create_task(background_tasks: BackgroundTasks):
    # 백그라운드 작업 예약
    background_tasks.add_task(my_async_background_task)
    return {"message": "백그라운드 작업 예약 완료"}

# 비동기 백그라운드 작업 함수
async def my_async_background_task():
    # 비동기 작업 로직 구현
    print("비동기 백그라운드 작업 실행")

위 예제에서는 my_async_background_task() 함수를 async 키워드로 정의한 후, create_task() 함수에서 해당 함수를 예약하였습니다. “비동기 백그라운드 작업 실행” 메시지가 출력될 때까지 대기하지 않고 다음 작업을 실행할 수 있습니다.

3. Celery 등의 작업 큐 사용하기

FastAPI에서 백그라운드 작업 예약을 보다 고급화하려면, Celery와 같은 작업 큐를 사용할 수 있습니다. Celery는 분산 작업 처리를 위한 오픈소스 솔루션으로써, 비동기 작업을 효율적으로 처리할 수 있습니다.

FastAPI 백그라운드 작업을 Celery와 연동하기 위해서는 추가 설정이 필요합니다. 이에 대해서는 별도의 포스트에서 다루겠습니다.

참고 자료