2014-04-17 1 views
9

셀웨어 docs을 따라 내 dev 컴퓨터에 2 개의 대기열을 정의했습니다.로컬 호스트의 장고/셀러리 다중 대기열 - 작동하지 않는 라우팅

내 셀러리 설정 :

CELERY_ALWAYS_EAGER = True 
CELERY_TASK_RESULT_EXPIRES = 60 # 1 mins 
CELERYD_CONCURRENCY = 2 
CELERYD_MAX_TASKS_PER_CHILD = 4 
CELERYD_PREFETCH_MULTIPLIER = 1 
CELERY_CREATE_MISSING_QUEUES = True 
CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'), 
    Queue('feeds', Exchange('feeds'), routing_key='arena.social.tasks.#'), 
) 
CELERY_ROUTES = { 
    'arena.social.tasks.Update': { 
     'queue': 'fs_feeds', 
    }, 
} 

내가 내 프로젝트의 VIRTUALENV에 두 개의 터미널 창을 오픈하고, 다음 명령을 실행 :

terminal_1$ celery -A arena worker -Q default -B -l debug --purge -n deafult_worker 
terminal_2$ celery -A arena worker -Q feeds -B -l debug --purge -n feeds_worker 

내가 뭘 얻을 모든 작업이 처리되고 있다는 것입니다 두 대기열.

나의 목표는 CELERY_ROUTES에 정의 된 하나의 작업 만 처리하고 다른 모든 작업을 처리하는 기본 대기열을 갖는 것입니다.

나는이 SO question, rabbitmqctl list_queues 반환 celery 0을 따라 두 번 rabbitmqctl list_bindings 반환 exchange celery queue celery []를 실행. 토끼 서버를 다시 시작해도 아무 것도 바뀌지 않았습니다.

답변

18

좋아요, 그래서 알아 냈습니다. 다음은 내 질문과 동일한 것에 대해 궁금해하는 사람들을 위해 셀레를 실행하는 방법과 설정, 설정입니다.

설정

CELERY_TIMEZONE = TIME_ZONE 
CELERY_ACCEPT_CONTENT = ['json', 'pickle'] 
CELERYD_CONCURRENCY = 2 
CELERYD_MAX_TASKS_PER_CHILD = 4 
CELERYD_PREFETCH_MULTIPLIER = 1 

# celery queues setup 
CELERY_DEFAULT_QUEUE = 'default' 
CELERY_DEFAULT_EXCHANGE_TYPE = 'topic' 
CELERY_DEFAULT_ROUTING_KEY = 'default' 
CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'), 
    Queue('feeds', Exchange('feeds'), routing_key='long_tasks'), 
) 
CELERY_ROUTES = { 
    'arena.social.tasks.Update': { 
     'queue': 'feeds', 
     'routing_key': 'long_tasks', 
    }, 
} 

어떻게 셀러리를 실행하려면?

터미널 - 탭 1 :

celery -A proj worker -Q default -l debug -n default_worker 

이 기본 대기열에서 작업을 소비 최초의 노동자를 시작합니다. 노트! -n default_worker은 첫 번째 작업자에게는 필수 항목이 아니지만 다른 셀러리 인스턴스가 실행중인 경우 필수 항목입니다. -n worker_name을 설정하면 [email protected]%h과 같습니다.

터미널 - 탭 2 :이 두 번째 작업자가 시작됩니다

celery -A proj worker -Q feeds -l debug -n feeds_worker 

그 피드 큐에서 소비자 작업. 알림 -n feeds_worker-l debug (로그 수준 = 디버그)로 실행중인 경우 두 작업자가 둘 사이에 동기화 중임을 알 수 있습니다.

터미널 - 탭 3 :

celery -A proj beat -l debug 

이 당신의 CELERYBEAT_SCHEDULE의 일정에 따라 작업을 실행 비트를 시작합니다. 작업을 변경하지 않았거나 CELERYBEAT_SCHEDULE입니다.

예를 들어 피드 대기열로 이동해야하는 작업에 대한 내 CELERYBEAT_SCHEDULE을 보는 방법이있다 :

CELERYBEAT_SCHEDULE = { 
    ... 
    'update_feeds': { 
     'task': 'arena.social.tasks.Update', 
     'schedule': crontab(minute='*/6'), 
    }, 
    ... 
} 

당신이 볼 수 있듯이

, 'options': {'routing_key': 'long_tasks'}를 추가하거나 이동해야 큐에 무엇을 지정하기위한 필요가 없습니다.또한 Update이 대문자 인 이유에 대해 궁금한 점이 있다면, 해당 하위 작업이 celery.Task이라는 하위 클래스로 정의되어 있기 때문입니다.

+0

셀러 리 3.1에 새로운 형식의 'task_queue'가 사용되었습니다. 'CELERY_ROUTES'사용 중입니다. – Netro

관련 문제