2011-02-18 8 views
6

저는 celeryd를 데몬으로 실행하고 있지만 때로 정상적으로 중지하는 데 문제가 있습니다. TERM 신호를 보내고 큐에 항목 (이 경우 service celeryd stop)이 있으면 celeryd는 새 작업을 중지하고 모든 작업자 프로세스를 종료합니다. 그러나 상위 프로세스는 종료되지 않습니다.celeryd 중지 문제

저는 Celeryd가 A와 B라는 별개의 작업자 기계에서 실행되는 시나리오를 만났습니다. RabbitMQ 서버에 약 1000 개의 메시지가 있으면 A를 종료하고 위에서 설명한 상황을 경험했습니다 . B는 계속 작동하지만 서버에 남아있는 약 40 개의 메시지로 정지되었습니다. 그러나 나는 B를 정확하게 멈출 수 있었다.

B를 다시 시작하여 대기열에서 40 개 항목을 가져올지를 확인했지만 그렇지는 않습니다. 다음으로, 나는 열심히 A를 죽였다. 그 후 B가 작업을 포착했다.

결론적으로 부모 프로세스는 RabbitMQ 서버의 40 개 항목을 자식으로 예약했습니다. 그것은 아이들을 올바르게 거둬 들일 것이지만 수동으로 죽이지 않으면 그 아이템을 RabbitMQ에 다시 놓지 않을 것입니다.

비슷한 경험이 있습니까? 나는 셀러리에게 2.2.2

+0

아마 대부분의 자식 프로세스는 여전히 IO 작업에 매달리고 있습니다. I/O 작업이있을 때 celeryd를 중지하려고하면 비슷한 문제가 발생합니다. 프로세스가 멈추고 kill -9가 도움이됩니다. 이것이 도움이 될지 확실하지 않지만 gevent 또는 Eventlet (celeryd -P eventlet)을 사용하여 celeryd를 실행하면 실험자가 좋습니다. 스레드가 작동합니다. – Jerzyk

답변

3

를 실행 해요

나는 이것이 관련이 생각 :

https://github.com/celery/celery/issues/264

작동합니다 당신의 settings.py 파일에

CELERY_DISABLE_RATE_LIMITS = False 

설정.

+0

와우! 그걸 어떻게 알아 냈어? – Zach