2012-05-07 2 views
4

pip install django-celery을 실행하는 Django Celery 버를 설치했습니다. 이 설치된 셀러리와 필요한 라이브러리. 셀러리와 다시마.Django Celery 작업이 완료되지 않고 계속 보류 중임

설치된 응용 프로그램 목록에 djcelery을 추가하고 syncdbmigrate 명령을 실행하여 테이블을 만들었습니다.

나는 RabbitMQ를 설치하고이 명령을 사용하여 사용자 및 가상 호스트 만들었습니다

BROKER_URL = "amqp://trakklr:[email protected]:5672//trakklr" 
CELERY_IMPORTS = ("app.trackers.tasks",) 

내가있는 tasks.py 파일을 만든 :
rabbitmqctl add_user trakklr trakklr 
rabbitmqctl add_vhost /trakklr 
rabbitmqctl set_permissions -p /trakklr trakklr ".*" ".*" ".*" 

나는이 두 줄을 포함하는 내 설정 파일을 편집을 내 모듈 trackers :

from celery.task import task 

@task(name="trackers.tasks.add") 
def add(x, y): 
    print("In task %s" % add.request.id) 
    return x + y 

나는 스타 테드 같은 터미널 창에서 셀러리 데몬 :

:
[2012-05-07 15:30:44,681: DEBUG/MainProcess] Start from server, version: 8.0, properties: {u'information': u'Licensed under the MPL. See http://www.rabbitmq.com/', u'product': u'RabbitMQ', u'copyright': u'Copyright (C) 2007-2011 VMware, Inc.', u'capabilities': {}, u'platform': u'Erlang/OTP', u'version': u'2.7.1'}, mechanisms: [u'PLAIN', u'AMQPLAIN'], locales: [u'en_US'] 
[2012-05-07 15:30:44,682: DEBUG/MainProcess] Open OK! known_hosts [] 
[2012-05-07 15:30:44,683: DEBUG/MainProcess] using channel_id: 1 
[2012-05-07 15:30:44,684: DEBUG/MainProcess] Channel open 
[2012-05-07 15:30:44,686: WARNING/MainProcess] discard: Erased 3 messages from the queue. 
[2012-05-07 15:30:44,687: WARNING/MainProcess] 

-------------- [email protected] v2.5.3 
---- **** ----- 
--- * *** * -- [Configuration] 
-- * - **** --- . broker:  amqp://[email protected]:5672//trakklr 
- ** ---------- . loader:  djcelery.loaders.DjangoLoader 
- ** ---------- . logfile:  [stderr]@DEBUG 
- ** ---------- . concurrency: 1 
- ** ---------- . events:  OFF 
- *** --- * --- . beat:  OFF 
-- ******* ---- 
--- ***** ----- [Queues] 
-------------- . celery:  exchange:celery (direct) binding:celery 


[Tasks] 
    . celery.backend_cleanup 
    . celery.chord 
    . celery.chord_unlock 
    . trackers.tasks.add 

[2012-05-07 15:30:44,693: DEBUG/MainProcess] [Worker] Loading modules. 
[2012-05-07 15:30:44,696: DEBUG/MainProcess] [Worker] Claiming components. 
[2012-05-07 15:30:44,697: DEBUG/MainProcess] [Worker] Building boot step graph. 
[2012-05-07 15:30:44,697: DEBUG/MainProcess] [Worker] New boot order: ['queues', 'pool', 'mediator', 'beat', 'autoreloader', 'timers', 'state-db', 'autoscaler', 'consumer'] 
[2012-05-07 15:30:44,699: DEBUG/MainProcess] Starting celery.concurrency.processes.TaskPool... 
[2012-05-07 15:30:44,711: DEBUG/MainProcess] created semlock with handle 3077668864 
[2012-05-07 15:30:44,711: DEBUG/MainProcess] created semlock with handle 3077664768 
[2012-05-07 15:30:44,712: DEBUG/MainProcess] created semlock with handle 3077660672 
[2012-05-07 15:30:44,712: DEBUG/MainProcess] created semlock with handle 3077656576 
[2012-05-07 15:30:44,713: DEBUG/MainProcess] created semlock with handle 3077652480 
[2012-05-07 15:30:44,713: DEBUG/MainProcess] created semlock with handle 3077648384 
[2012-05-07 15:30:44,713: DEBUG/MainProcess] created semlock with handle 3077644288 
[2012-05-07 15:30:44,714: DEBUG/MainProcess] created semlock with handle 3077640192 
[2012-05-07 15:30:44,714: DEBUG/MainProcess] created semlock with handle 3077636096 
[2012-05-07 15:30:44,734: DEBUG/MainProcess] worker handler starting 
[2012-05-07 15:30:44,738: DEBUG/MainProcess] result handler starting 
[2012-05-07 15:30:44,744: DEBUG/PoolWorker-1] Closed channel #1 
[2012-05-07 15:30:44,746: INFO/PoolWorker-1] child process calling self.run() 

지금 나는이 같은 작업을 대기열에 파이썬 쉘에 새로운 터미널 창을 열어 :

python manage.py celeryd -l debug --discard --settings=production 

가 실행이이 결선

>>> from app.trackers.tasks import add 
>>> task = add.delay(1, 4) 
>>> task 
<AsyncResult: c3298494-de50-41b5-8a3a-77017a1298f2> 
>>> task.state 
u'PENDING' 
>>> task.result 

작업이 완료되지 않습니다. 그들은 "보류 중"으로 끊임없이보고됩니다. 셀러리 데몬이 실행중인 창에서 아무런 변화가 보이지 않습니다. 그러나 CTRL^C을 누를 때. 나는이 추가 텍스트를 얻을 : 마지막 라인에서 볼 수 있듯이

^C[2012-05-07 15:31:55,541: DEBUG/MainProcess] result handler got IOError(4, 'Interrupted system call') -- exiting 
[2012-05-07 15:31:55,544: DEBUG/MainProcess] celery.concurrency.processes.TaskPool OK! 
[2012-05-07 15:31:55,546: DEBUG/MainProcess] Starting celery.worker.mediator.Mediator... 
[2012-05-07 15:31:55,552: DEBUG/MainProcess] celery.worker.mediator.Mediator OK! 
[2012-05-07 15:31:55,553: DEBUG/MainProcess] Starting celery.worker.consumer.Consumer... 
[2012-05-07 15:31:55,556: WARNING/MainProcess] [email protected] has started. 
[2012-05-07 15:31:55,557: DEBUG/MainProcess] Consumer: Re-establishing connection to the broker... 
[2012-05-07 15:31:55,570: DEBUG/MainProcess] Start from server, version: 8.0, properties: {u'information': u'Licensed under the MPL. See http://www.rabbitmq.com/', u'product': u'RabbitMQ', u'copyright': u'Copyright (C) 2007-2011 VMware, Inc.', u'capabilities': {}, u'platform': u'Erlang/OTP', u'version': u'2.7.1'}, mechanisms: [u'PLAIN', u'AMQPLAIN'], locales: [u'en_US'] 
[2012-05-07 15:31:55,571: DEBUG/MainProcess] Open OK! known_hosts [] 
[2012-05-07 15:31:55,571: DEBUG/MainProcess] Consumer: Connection established. 
[2012-05-07 15:31:55,572: DEBUG/MainProcess] using channel_id: 1 
[2012-05-07 15:31:55,573: DEBUG/MainProcess] Channel open 
[2012-05-07 15:31:55,576: DEBUG/MainProcess] basic.qos: prefetch_count->4 
[2012-05-07 15:31:55,576: DEBUG/MainProcess] using channel_id: 2 
[2012-05-07 15:31:55,577: DEBUG/MainProcess] Channel open 
[2012-05-07 15:31:55,589: DEBUG/MainProcess] Consumer: Starting message consumer... 
[2012-05-07 15:31:55,590: DEBUG/MainProcess] Consumer: Ready to accept tasks! 
[2012-05-07 15:31:55,591: INFO/MainProcess] Got task from broker: trackers.tasks.add[c3298494-de50-41b5-8a3a-77017a1298f2] 

, 셀러리가 작업을 가지고 있지만, 그것은 단지가 중지됩니다. 또한 나는 그 사이에 그 CTRL ^C을 눌러야 만하는 이유를 알아낼 수 없습니다. 끊임없이 보류 중입니다.

+0

대기 중임이 작업이 실행 중임을 의미하지 않습니다. 제출되었지만 대기열에 계속 남아있는 작업 (및 기타 여러 조건)은 대기 중으로 표시됩니다. 작업이 시작되었는지 여부를 알고 싶으면 CELERY_TRACK_STARTED 옵션을 사용하십시오. –

+0

또한 일부 백엔드를 인식 할 수없는 경우 작업 ID를 보류 상태로보고합니다. meta = self.get (self.get_key_for_task (task_id)) 메타가 아닌 경우 : return { 'status ': states.PENDING,'result ': None} – dalore

답변

7

수정 됨. 이는 내 __init__.py 장고 (Django)에서 Gevent를 사용하여 일부 파이썬 모듈에 패치를 적용했기 때문입니다.

Gunicorn은 Gevent를 사용하며 Celery는 Eventlet을 사용하는 것으로 보입니다. Gevent의 원숭이가 스레드와 다중 처리 모듈을 패치하면 Celery에서 딸꾹질이 발생합니다.

관련 문제