-
Django 에서 Celery로 비동기 worker 실행하기💻 프로그래밍/Django 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 둘 다 비슷하지만, Redsi의 경우 갑작스러운 이벤트 중단으로 인한 data 손실이 좀 더 크다고 하네요.
http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#first-steps
2. Celery option 정하기
12345678910111213141516171819import osfrom celery import Celeryfrom django.conf import settingsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conf.local')BROKER_URL = settings.REDIS_BROKER_URLapp = Celery('task', broker=BROKER_URL)@app.taskdef 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
'💻 프로그래밍 > Django' 카테고리의 다른 글
update_or_create()하는데 갑자기 Dead Lock 너는 왜나오냐?! (feat. transaction) (2) 2020.10.26 [개념] Django는 Web Server가 아니라구요!! (1) 2020.08.10 [Pytest] TDD를 해야하는 이유 (django TDD 적용하기) (0) 2019.12.08 쿼리를 줄이자! select_related vs prefetch_related (2) 2019.07.21 validation 체크 노가다를 줄여주는 Django form, modelform, formset 사용 (0) 2019.04.27