파이썬 라이브러리 소개: Celery

비동기 작업을 손쉽게 관리해주는 라이브러리 Celery 에 대해 간단히 소개 드리겠습니다.

파이썬에서는 비동기 모듈을 사용하지 않으면 기본적으로 동기 방식으로 작업을 처리합니다. asyncio를 사용하지 않고 비동기 작업을 원할 때 Celery 를 사용하면 됩니다.

Celery 는 라이브러리지만 broker 와 backend 가 필요합니다. broker는 큐이고 backend 는 샐러리가 처리한 결과물을 저장합니다. 아래 그림을 보시면 이해가 쉽습니다.

Celery 작동 흐름

python 에서 celery 라이브러리를 이용해 작업 요청을 하면 celery 라이브러리는 broker 에 메시지를 삽입합니다(큐에 추가). 다른 프로세스인 worker 는 대기하고 있다가 큐에 메시지가 들어오면 읽고 작업을 수행합니다. 작업이 완료되면 backend 에 작업 결과물을 저장합니다.

그림에서는 마치 동기적인 작업처럼 그려 놓았는데 작업 요청은 non-blocking 입니다. 따라서 시간이 오래 걸리는 여러 개의 작업을 먼저 요청해 두고 다른 작업을 하다가 나중에 결과 수신을 해도 되는 것이죠. 수신의 경우엔 blocking 입니다. 작업이 완료될때까지 계속 대기합니다. 이 경우 코드는 아래와 비슷해질 것입니다.

def main():
    # 시간이 오래 걸리는 작업 요청
    hw1 = heavy_work_1.delay()
    
    # 다른 작업 수행
    work2_result = work2()
    ...
    
    # 결과 수신
    hw_result = hw1.get()
    
    return hw_result, work2_result

이번에는 흔한 예제를 보겠습니다. 회원가입 예시인데요. 회원가입을 하게 되면 database 에 레코드를 추가하는 작업은 오래 걸리지 않지만 이메일 발송이 2초에서 3초 정도 소요되는 경우가 발생합니다. 이런 절차를 전부 기다리게 되면 고객이 가입 버튼을 누르고 2초에서 3초정도 기다리게 됩니다. 이 때 celery 에게 메일 발송 작업을 요청하고 고객에게 응답을 바로 전송하면 지연 시간 없이 다음 페이지로 넘어가게 됩니다. 확인 메일 발송에는 보통 반환값을 기다릴 필요가 없기 때문에 결과를 수신하는 코드는 제거했습니다.

def register_user(username, password, email):
    # 데이터베이스에 회원 레코드 삽입
    db_success = insert_to_database(username, password)
    
    if not db_success:
        return False
        
    # 확인 메일 발송 (non-blocking)
    send_verification_email.delay(username, email)
    
    # 메일 발송 기다리지 않고 응답 전송
    return True

두 가지 시나리오로 간단하게 celery 라이브러리를 알아봤는데요. 기회가 된다면 celery 의 지원 범위와 사용 예시를 포스팅하도록 하겠습니다.

파이썬 라이브러리 소개: Celery”에 대한 1개의 생각

  1. 핑백: ICE Land 2월 4주차 | ICE Land Blog

댓글 남기기