Я использую celery 2.4.1 с python 2.6, backend rabbitmq и django. Я бы хотел, чтобы моя задача могла правильно очищаться, если рабочий завершает работу. Насколько мне известно, вы не можете предоставить деструктор задачи, поэтому я попытался подключиться к сигналу worker_shutdown .
Примечание: AbortableTask работает только с серверной частью базы данных, поэтому я не могу его использовать.
from celery.signals import worker_shutdown
@task
def mytask(*args)
obj = DoStuff()
def shutdown_hook(*args):
print "Worker shutting down"
# cleanup nicely
obj.stop()
worker_shutdown.connect(shutdown_hook)
# blocking call that monitors a network connection
obj.stuff()
Однако ловушка выключения никогда не вызывается. Ctrl-C'ing рабочего не убивает задачу, и мне нужно вручную убить его из оболочки.
Итак, если это неправильный способ, как мне разрешить задачи корректно завершать работу?