Django Celery 사용법 [with RabbitMQ]

Posted by 엘키의 주절 주절 on September 27, 2016

설치

1
2
3
pip install -U Celery
pip install django-celery
# 데이터베이스 migration 필요. [djcelery를 위해]

Django 설정

  • settings.py에 아래 내용을 추가한다.
1
2
3
4
5
import djcelery

djcelery.setup_loader()

BROKER_URL = "amqp://guest:guest@localhost:5672//"
  • settings.py 파일에 추가
1
2
3
4
INSTALLED_APPS = (
'djcelery',
'myapp',
)
  • 두 가지를 추가해야 한다. myapp은 개발하고 있는 app의 이름이 되겠다.

Task 생성

1
2
3
4
5
6
7
8
9
10
from djcelery import celery
@celery.task(name='tasks.add')
def add(x,y):
 return x + y

@celery.task(name='tasks.sleeptask')
def sleeptask(i):
 from time import sleep
 sleep(i)
 return i

테스트 목적으로 두 개의 task를 만들었다. 하나는 즉시 값을 리턴하는 add함수와 10초 뒤에 task를 반환하는 sleeptask 함수이다.

View 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# django app의 views.py에 아래의 내용을 추가
from django.http import HttpResponse
from myapp import tasks

def test_celery(request):
    result = tasks.sleeptask.delay(2)
    result2 = tasks.add.delay(2,5)
    return HttpResponse("this is task test (id : %s)" % result.id)

# 이렇게 view를 만들어놓고 url에 이 view를 호출할 수 있도록 해야한다. 
# urlpattern에 아래 내용을 추가해준다.

import views as taskview
urlpatterns = patterns(
                        ...
                        url(r'^test$',taskview.test_celery),
                        )

가동

1
python manage.py celeryd -l info

직렬화

Consumer

  • 주의 사항
    • 15672는 웹 포트다. 5672 포트로 연결해야 한다.
    • 연결이 RabbitMQ에서 끊어질 시에는 RabbitMQ 관리 웹 페이지에서 Can access virtual hosts가 설정되어있는 계정인지 확인해볼 것.
    • tasks로 만들어 던지는 함수에 req를 바로 던질 수 없다. pickle 가능한 object만 던져야 한다. 즉 파라미터들을 꺼내서 던져야 한다는 의미.

      user_no = int(req.session[‘user_no’])
      return tasks.celery.delay(user_no)

Pycharm Celery 디버깅 설정

Pycharm Celery 디버깅 설정

참고