ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    * 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

     

    댓글

운동하는 개발자 JAY-JI