python/fastapi

[fastapi] background task

seokhyun2 2023. 6. 4. 17:57

개요

background task를 처리하는 방식은 다양한데, fastapi의 framework 내에서도 충분히 처리를 할 수 있어서 그 방식에 대해서 정리를 해보려고 합니다.

background task는 API 요청을 받아서 실시간으로 응답을 바로 주는 것이 아닌 API 요청에 대해서 별도로 천천히 처리해도 되는 작업들에 사용하게 됩니다.

예를 들면 회원가입을 할 때, 회원가입을 완료했을 때 성공했다는 응답을 반환하고 email로 환영 메세지를 발송하는 것과 같은 경우가 있을 수 있습니다.

 

사용방법

사용 방법은 공식 홈페이지에 잘 나와있습니다. (https://fastapi.tiangolo.com/tutorial/background-tasks/)

문서의 예시 코드를 한 번 보도록 하겠습니다.

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()


def write_notification(email: str, message=""):
    with open("log.txt", mode="w") as email_file:
        content = f"notification for {email}: {message}"
        email_file.write(content)


@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Notification sent in the background"}

fastapi의 BackgroundTasks를 import하고, send_notification의 parameter에 함께 받아서 add_task 함수를 호출하면 됩니다.

add_task에서 첫번째 parameter는 method, 그 뒤에는 해당 method에 필요한 parameter를 나열해서 넣어주면 됩니다.

참고로 fastapi의 BackgroundTasks 클래스는 starlette.background를 활용하여 구현했기 때문에 자세한 내용은 starlette 문서도 참고하시면 좋습니다. (https://www.starlette.io/background/)

 

BackgroundTasks는 명칭이 복수의 형태이고 add_task를 호출하는 형태로 보았을 때 예상하셨을텐데 여러 개의 task를 등록할 수도 있습니다.

위의 예시에서 send_notification API에서 write_notification이라는 task를 하나만 등록하는데, 바로 밑에 다른 task를 추가로 등록할 수 있습니다.

이 때 주의할 점이 있는데, 등록된 여러 개의 task는 순차적으로 실행이 되고 처음에 돌던 task에서 exception이 발생되면 추가로 등록된 task들은 실행이 되지 않습니다.

 

정리

fastapi 문서에서도 api server와 동일한 Process에서 실행이 될 필요가 없고, heavy한 background task를 실행해야하는 경우라면 큐를 활용하는 Celery를 활용하는 방식도 추천을 하고 있습니다.

서비스가 이미 성숙하고 시스템이 크다면 큐를 별도로 운영하면서, 회원가입 시에 email을 큐에 넣어주고, 해당 큐를 바라보면서 email 전송만 처리하는 worker를 별도로 구성할 수 있겠지만 서비스가 초기고 시작 단계라면 처음부터 그런 시스템까지 구축하기엔 부담스러울 수 있기 때문에 background task를 활용하여 간단하게 처리하는 방식도 있다 정도로 생각해주시면 될 것 같습니다.

 

 

'python > fastapi' 카테고리의 다른 글

[fastapi] lifespan  (0) 2024.03.03
[fastapi] Middleware  (2) 2023.07.02
[fastapi] fastapi utils를 활용한 주기적인 작업(periodic task) 실행하기  (0) 2023.06.18