Celery 에 대해 알아보자 01
Celery
Celery 란?
Celery 란 분산 메시징에 기반을 둔 비동기 작업 큐입니다. 주로 파이썬, 특히 장고와 결합되어 사용됩니다(다른 언어도 상관 없음!)
Celery 의 특징을 뽑자면 다음 10가지 입니다.
- 분산성 : 워커들은 여러개의 머신에 배포될 수 있습니다.
- 브로커 : 메시지 브로커는 클라이언트와 워커 사이를 중계하는 역할을 합니다.
- 백엔드 : 상태를 저장하고, 태스크의 결과를 반환합니다.(RabbitMQ, Redis, MySql 등등)
- 태스크 : 작업의 단위입니다.
- 스케줄링 : 기간 단위의 작업이나, 크론잡 같은 태스크를 수행할 수 있습니다.
- 병렬성 : 병렬적으로 작업을 처리할 수 있습니다.
- 결함 내성 : 태스크가 중간에 실패하거나 망가져도 다시 수행할 수 있는 다양한 메커니즘을 제공합니다.
- 통합성 : 장고, 플라스크, 다른 파이썬 프레임워크와 궁합이 좋습니다.
- 워크플로우 : 태스크를 오케스트레이션해서 복잡한 워크플로우도 구성할 수 있습니다.
- 모니터링 : Flower 와 같은 툴을 사용해서 실시간 모니터링이 가능합니다.
사용 예시?
- 머신 러닝 모델을 실행하는 경우
- 이메일 보내기와 같은 외부 api 에 의존하는 비동기 작업을 수행해야 하는 경우
- 웹 크롤링을 수행하는 경우
- 리포트와 같이 대용량 데이터를 후처리해서 생성하는 경우
- 데이터 분석이나 처리를 하는 경우
간단한 Celery 사용 예시 아래는 Celery를 사용하여 시간이 오래 걸리는 작업을 비동기적으로 처리하는 간단한 예시입니다.
예시 코드
docker
1
2
3
docker run -d --name redis-server -p 6379:6379 redis
이 명령어는 Redis 컨테이너를 백그라운드에서 실행하고, 호스트의 6379 포트를 컨테이너의 6379 포트에 매핑합니다.
Celery 설정 (tasks.py):
1
2
3
4
5
6
7
8
9
10
11
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379')
@app.task
def long_running_task(n):
# 시간이 오래 걸리는 작업을 시뮬레이션
time.sleep(n)
return f"{n}초 동안 실행된 작업이 완료되었습니다."
태스크 실행 (run.py):
1
2
3
4
5
6
7
8
9
10
11
12
from tasks import long_running_task
# 비동기적으로 태스크 실행
result = long_running_task.delay(10)
print("태스크가 백그라운드에서 실행 중입니다.")
print("다른 작업을 계속할 수 있습니다.")
# 필요한 경우 결과를 기다릴 수 있습니다
print(result.get())
Celery 워커 실행
별도의 터미널에서 다음 명령어를 실행하여 Celery 워커를 시작합니다:
1
2
3
celery -A tasks worker --loglevel=info
파이썬 스크립트 실행
1
2
3
python run.py
이 예시에서는 10초 동안 실행되는 가상의 작업을 Celery를 통해 비동기적으로 처리합니다. long_running_task.delay(10)를 호출하면 작업이 즉시 큐에 추가되고, 메인 프로그램은 계속 실행됩니다. 필요한 경우 result.get()을 통해 작업 결과를 기다릴 수 있습니다.
결론
Celery를 사용하면 복잡하고 시간이 오래 걸리는 작업을 효율적으로 관리하고 실행할 수 있습니다. 이를 통해 애플리케이션의 응답성을 높이고, 리소스를 효율적으로 사용할 수 있습니다. 특히 대규모 데이터 처리, 주기적인 작업 실행, 외부 API와의 통신 등에서 Celery의 강점이 두드러집니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.