개요
API 서버는 클라이언트에 대한 요청을 처리하고 응답을 반환한다. 하지만 데이터 처리나 IO 작업과 같이 처리해야 하는 작업이 오래 걸리는 경우에는 응답을 반환한 후 작업을 백그라운드로 수행하도록 처리할 수도 있다.
FastAPI는 애플리케이션이 응답을 반환한 후에 실행할 백그라운드 작업을 정의할 수 있도록 제공하고 있다. 방법을 알아본다.
BackgroundTasks
FastAPI는 BackgroundTasks라는 클래스를 사용하여 애플리케이션에서의 백그라운드 작업을 지원한다. 임포트는 아래와 같이 하면 된다.
from fastapi import BackgroundTasks
FastAPI는 BackgroundTasks 객체를 생성하고, 경로에 매핑된 함수에 매개변수로 전달하는 방식으로 사용하게 된다.
작업할 함수 생성
먼저 백그라운드로 실행할 함수를 정의해야 한다.
간단하게 처리에 10초 정도 필요한 함수가 있다고 하자. 참고로 일반 함수, 코루틴 모두 백그라운드로 처리할 수 있다.
import asyncio
async def io_func(message):
print(datetime.datetime.now())
print(message)
await asyncio.sleep(10)
print(datetime.datetime.now())
백그라운드 작업 추가
백그라운드로 작업을 수행하기 위해서는 경로에 매핑된 함수의 매개변수로 BackgroundTasks를 전달해야 한다.
from fastapi import BackgroundTasks
@app.get("/test/background")
async def test_background(background_tasks: BackgroundTasks):
background_tasks.add_task(io_func, message='hello world')
return f'{datetime.datetime.now()} OK'
그리고 BackgroundTasks.add_task 함수로 백그라운드 실행 함수의 이름과, 필요한 매개변수를 전달한다.
테스트
애플리케이션을 실행하고 서버로 요청을 보내보자.
즉시 응답이 돌아오는 모습을 확인할 수 있다. 그리고 애플리케이션 로그를 확인하면 응답한 이후에 실행된 것을 확인할 수 있다.
참고 문서
https://fastapi.tiangolo.com/ko/tutorial/background-tasks