개요
업무 상 Airflow에서 CeleryExecutor를 사용하고 있어 이전에 2023.08.09-[Python] Celery 란 글로 간단한 개념을 알아보았었다. 하지만 막상 Celery를 들여다보는 상황이 되면 관련 개념 부족을 느끼곤 했다. 때문에 아주 간단하게 Celery를 직접 설치해 보고 실행해 보는 경험에 대한 필요성을 느껴 적어두려고 한다.
공식 문서의 튜토리얼을 참고하여 작성했고, Message Broker로는 Redis를 사용한다. 단순 테스트이기 때문에 환경은 killercoda를 사용한다.
Message Broker 설치
Celery를 사용하기 위해서는 Worker 간 Task를 주고받는데 사용할 Message Broker가 필요하다.
이 글에서는 redis를 사용한다고 명시했으므로 apt로 직접 설치하거나 컨테이너 형식으로 실행시킨다. 이 글에서는 docker를 사용하여 실행시켰다.
docker run -d -p 6379:6379 redis
Celery 설치
Celery를 사용하기 위해서는 당연하게도 Celery 설치가 필요하다. Celery는 pip를 통해 설치할 수 있다.
pip install celery
Celery Worker 실행
Celery Worker를 실행시키기 위해서는 먼저 Celery 인스턴스가 필요하다. Celery 인스턴스는 애플리케이션이라고도 하며, task 생성이나 worker 관리처럼 Celery 내에서 수행하는 모든 작업의 시작점이 된다. 그리고 생성한 작업을 호출하여 사용하게 된다.
인스턴스 생성
아래 코드는 공식 문서에서 제시하는 예시 파일로, 두 인수의 합을 반환하는 add를 정의한다. tasks.py라는 이름으로 생성했다.
# tasks.py
from celery import Celery
# broker url 지정 필요
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
return x + y
Celery 객체 생성자에는 현재 모듈의 이름을 첫 번째 매개변수로, 그리고 broker의 url을 전달한다. 첫 번째 매개변수는 작업 정의 시 이름을 자동으로 생성하는 데 사용한다.
Celery Worker 실행
Worker를 실행할 때는 worker라는 하위 명령어를 사용하여 실행한다. -A라는 옵션으로 실행할 모듈을 지정해야 한다.
celery -A tasks worker --loglevel=INFO
Task 호출
Celery Task를 호출할 때는 delay 함수를 사용한다.
from tasks import add
add.delay(4, 4)
Task를 호출하면 Worker 로그에 다음과 같이 호출된 task의 이름과 id를 확인할 수 있다.
Flower
Flower는 Celery 클러스터를 모니터링하고 관리할 수 있도록 해주는 오픈소스 웹 애플리케이션으로, 실시간으로 Celery Worker와 Task의 상태를 제공한다.
Flower 설치
Flower는 pip를 사용하여 설치할 수 있다.
pip install flower
Flower 실행
Flower를 실행할 때는 모니터링할 Celery 클러스터의 broker_url을 제공해야 한다.
celery --broker=redis://localhost:6379/0 flower
웹 접속
Celery Flower는 기본적으로 5555번 포트를 사용한다.
Celery Worker가 실행 중이라면 Online 상태임을 확인 할 수 있다. Celery Worker 프로세스가 종료되면 새로고침 없이 Offline 상태로 변경되며, 작업을 호출하면 worker가 Task를 처리하고 있는지, 처리를 완료했는지, 처리 상태는 어떤지 등을 실시간으로 확인할 수 있다.
참고 문서
https://docs.celeryq.dev/en/stable/getting-started/first-steps-with-celery.html
https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html#broker-redis
https://flower.readthedocs.io/en/latest/install.html