以编程方式撤销芹菜任务的正确程序

时间:2016-06-05 16:30:57

标签: python django celery

我写了一个用于撤销芹菜任务的小Python脚本:

from mydjangoproj.celery import app
i = app.control.inspect()
active = i.active(safe=True)
reserved = i.reserved(safe=True)
# Get the uuids for the active and reserved tasks
revoke_ids_list_a = [task['id'] for (worker, tasks) in active_filtered.iteritems() for task in tasks]
revoke_ids_list_r = [task['id'] for (worker, tasks) in reserved_filtered.iteritems() for task in tasks]
# combine them into one big list
revoke_ids_list = revoke_ids_list_a + revoke_ids_list_r
# Perform the revoking
revoked = []
for tid in revoke_ids_list:
    app.control.revoke(tid, terminate=True)
    revoked.append(tid)

似乎这种有效。然而,经常会有一些遗留下来的任务没有被撤销,而且我似乎偶尔需要多次运行该脚本以杀死所有内容。

有什么我想念的吗? (我知道停止守护进程并发出celery -A mydjangoproj purge -f会这样做,但我不想因各种原因进行清除)

另一个问题是,在重新启动芹菜守护程序并击败之后,我认为已被撤销的一些任务开始在工作人员中再次运行。这是为什么?

1 个答案:

答案 0 :(得分:0)

它取决于您在项目中使用的后端,revoke()仅适用于AMQP和Redis代理。

http://docs.celeryproject.org/en/latest/userguide/workers.html#remote-control

  

请注意,远程控制命令必须正常工作才能使撤销工作。   只有RabbitMQ(amqp)和支持远程控制命令   Redis就在这一点上。