백그라운드 작업 - 1에 이어서 글을 작성해 보겠습니다.
이번 글에서는 백그라운드 작업에 의존성 주입을 적용해 보겠습니다.
우선, 백그라운드 작업에서 의존성 주입을 적용한 예시 main.py 입니다.
import uvicorn
import time
from typing import Optional
from fastapi import BackgroundTasks, FastAPI, Depends, status
app = FastAPI()
def write_log(message: str):
time.sleep(2.0)
with open("log.txt", mode = "a") as log:
log.write(message)
def get_query(background_tasks : BackgroundTasks, q : Optional[str] = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)
return q
@app.post("/send-notification/{email}", status_code=status.HTTP_202_ACCEPTED)
async def send_notification(email: str, background_tasks: BackgroundTasks, q: str = Depends(get_query)):
message = f"message to {email}\n"
background_tasks.add_task(write_log, message)
return {"message":"Message sent"}
if __name__ == "__main__":
uvicorn.run("main:app", reload = True)
기존 백그라운드 작업 - 1에서 작성했던 코드와 거의 비슷합니다 !
우선, 백그라운드 작업 - 1에 없었던 get_query를 살펴 보겠습니다.
def get_query(background_tasks : BackgroundTasks, q : Optional[str] = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)
return q
위에 main.py에 send_notification 함수를 보면 의존성 주입에 get_query 함수를 사용한다는 것을 알 수 있습니다.
get_query에는 q를 전달 받아서 값을 return합니다.
get_query를 살펴보면, get_query의 함수 내부에서 background task를 수행할 수 있다는 것을 알 수 있습니다.
기존 백그라운드 - 1에서는 api에서만 background에 대한 작업을 수행했지만, 일반적인 함수 안에서도 이 background에 대한 작업을 수행 할 수 있다는 것을 알 수 있습니다.
아래 명령어로 main.py를 실행해 봅시다 !!
python main.py
http://127.0.0.1:8000/docs를 입력해서 fastapi 문서에 접속해 봅시다 !!
fastapi 문서에서 try it out을 누르고 다음과 같이 이메일을 입력 후 execute를 클릭해 봅시다.
잘 실행 된 것을 확인 할 수 있습니다.
write_log 함수에 의해서 생성된 로그를 보면 다음과 같이 생성된 것을 확인 할 수 있습니다.
이후에 다음과 같이 q를 입력해서 Execute를 해보겠습니다.
실행 완료 후에 log file을 살펴 보면 다음과 같이 log가 작성 되었다는 것을 확인 할 수 있습니다.
백그라운드 작업은 정말 좋은 기능중 하나이지만, 백그라운드 작업을 구현하기 위해서는 멀티 프로세실을 구현해야한다는 단점이 있습니다. Flask에서는 간단하게 subprocess 표준 라이브러리를 많이 활용해서 구현합니다.
정말 강력한 기능이기는 하지만, 백그라운드 작업에 대한 Fail Over를 처리하기 힘들며, 작업이 클 경우 서버가 사용해야할 리소스를 잡아 먹어 서버가 죽을 수도 있습니다. 이런 경우에는 큐(Queue)를 사용해서 해결 할 수 있습니다.
요즘은 클라우드의 큐 서비스를 많이 활용하는 편이고, 아니면 Celery, RabbitMQ 또는 Redis 등을 이용해 큐를 구현하고 나중에 기회가 있으면 공부해 보도록 하겠습니다.
'FastAPI' 카테고리의 다른 글
미들웨어 - 2 (0) | 2024.03.20 |
---|---|
미들웨어 - 1 (0) | 2024.03.19 |
백그라운드 작업 - 1 (2) | 2024.03.05 |
인증 (1) | 2024.02.27 |
의존성 주입 - 2 (0) | 2024.02.18 |