Django 에서 Celery로 비동기 worker 실행하기
안녕하세요! 운동하는 개발자 Jay 입니다.
오늘은 Celery라는 비동기 워커에 대해 알아 보겠습니다.
1. What is Celery ( 먹는 샐러리 아니죠~)
간단히 말하면 Django에서 비동기 처리를 위한 방법으로서 사용하는 것이 Celery 입니다. 우리가 비동기로 처리하고 싶은 작업들을 queue에 저장하면, Celery는 그 작업들을 가져와 처리합니다.
celery를 실행하는데 있어 필요한 것이, 앞서 말한 queue 입니다. celery에는 message brocker라고 합니다. 메세지를 주고 받을 수 있는 서비스들입니다. 메세지 브로커 종류에는 RabbitMQ, Redis 등이 있습니다.
아주 편하게도 docker에 RabbitMQ, Redis 이미지가 있기때문에, 저는 docker를 이용해 message brocker를 사용해보겠습니다. 둘 중에 하나만 하면 되기 때문에 저는 redis를 사용해 보겠습니다. docker에서 실행하는 방법은 아래와 같습니다.
- RabbitMQ : docker run -d -p 5462:5462 rabbitmq
- Redis: docker run -d -p 6379:6379 redis
* RabbitMQ, Redis 둘 다 비슷하지만, Redsi의 경우 갑작스러운 이벤트 중단으로 인한 data 손실이 좀 더 크다고 하네요.
http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#first-steps
2. Celery option 정하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conf.local')
BROKER_URL = settings.REDIS_BROKER_URL
app = Celery('task', broker=BROKER_URL)
@app.task
def say_hello():
"""
Task 테스트 함수
"""
return "hello ~"
|
cs |
celery를 실행하는 것은 생각보다 간단합니다. 첫번째로 celery instance가 필요합니다. celery 문서에서는 이것을 celery app이라고 부르더군요. Celery App은 다른곳에서 import할 수 있고, task를 만들거나 worker를 관리 할 수 있게 해줍니다.
celery app의 첫번째 인자는 현재 모듈의 이름입니다. 두번째는 message brocker 주소입니다. 저같은 경우 conf.local broker_url 을 정의해서, 위 처럼 썼지만 그렇지 않고 바로 주소를 입력해 줘도 상관은 없습니다.
마지막으로 비동기로 실행할 함수의 경우 @app.task 데코레이터를 써줍니다. 아 물론 비동기가 아닌 동기로도 사용 가능합니다.
여기까지 했으면, 이제 celery를 실행할 준비가 모두 끝났습니다. (매우 쉽죠?!)
3. Celery worker 실행
celery -A [모듈이름] worker --loglevel=info
위 명령어로 celery worker를 실행 시킨 후, django shell 에서 celery 함수를 import합니다.
delay() 메소드를 사용하면 작업(task)이 queue에 등록됩니다.
delay()를 통해 say_hello 동작을 queue에 등록하면, 실행 된 celery worker에서 redis에 등록된task(작업)을 실행하게 됩니다.
실제로 worker를 중단시키고 redis에 어떻게 작업이 등록되는지 확인해 보겠습니다.
redis 서버에 들어가 redis-cli로 접속해 확인할 수 있습니다.
1. select 0 - 0번 DB 선택
2. LLEN [key] - list에서 value의 개수를 조회
3. LRANGE [key] [start] [stop] - 인덱스로 범위를 지정해서 조회 (start:0, stop:-1 이면 전체 조회)
참고: http://redisgate.kr/redis/command/lrange.php#sortfunc
4. 마무리
오늘은 간단하게 나마 django에서 비동기 작업을 실행하는 방법에 대해 알아봤습니다. celery의 경우 저희 회사에서 실제로 유용하게 사용하고 있기때문에 글을 적으면서 좀 더 와닿았던 것 같습니다.
다음에는 celery worker 와 함께 사용할 수 있는 celery beat에 대해 알아보겠습니다.
감사합니다:D