한양과학기술고등학교

에듀테크 프로젝트 대시보드

백그라운드 작업

BackgroundTasks 이메일 Celery 큐

응답을 먼저 돌려주고 뒤에서 이어서 처리 — 이메일 발송, 로그 적재, 캐시 워밍 등.

1. BackgroundTasks

from fastapi import BackgroundTasks

def write_log(message: str):
    with open("log.txt", "a") as f:
        f.write(message + "\n")

@app.post("/signup")
def signup(email: str, tasks: BackgroundTasks):
    user = create_user(email)
    tasks.add_task(write_log, f"signup: {email}")
    tasks.add_task(send_welcome_mail, email)
    return {"ok": True}    # 응답 후 태스크들이 순차 실행됨

2. 의존성에서도 추가 가능

def get_query(bg: BackgroundTasks, q: str | None = None):
    if q:
        bg.add_task(record_search, q)
    return q

3. 한계와 대안

BackgroundTasks 로 충분한 경우
  • 가볍고 빠른 후처리 (수 초 이내), 실패해도 무방한 작업
별도 워커(Celery / RQ / Dramatiq / arq)가 필요한 경우
  • 재시도·스케줄·결과 추적이 필요
  • 작업이 무겁거나 오래 걸림 (워커 프로세스를 점유)
  • 앱이 재시작돼도 유실되면 안 됨 (BackgroundTasks 는 프로세스 메모리에만 존재)

4. 같은 이벤트 루프 주의

async def 태스크는 응답을 보낸 뒤 같은 이벤트 루프에서 실행됩니다. 무거운 동기 작업은 def 로 정의해 스레드풀로 보내세요.

"커넥션은 요청마다 열지 말고 풀에서 빌려 쓴다"