포스트

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 라이센스를 따릅니다.