💻 프로그래밍/Django

Django 에서 Celery로 비동기 worker 실행하기

피트웨어 제이 (FitwareJay) 2019. 12. 23. 00:06

안녕하세요! 운동하는 개발자 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

* 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에 등록됩니다.

 

django shell 에서 task 등록
redis 등록된 task를 celery worker 가 실행한 모습

 

delay()를 통해 say_hello 동작을 queue에 등록하면, 실행 된 celery worker에서 redis에 등록된task(작업)을 실행하게 됩니다.

실제로 worker를 중단시키고 redis에 어떻게 작업이 등록되는지 확인해 보겠습니다.

 

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