我写了一个用于撤销芹菜任务的小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
会这样做,但我不想因各种原因进行清除)
另一个问题是,在重新启动芹菜守护程序并击败之后,我认为已被撤销的一些任务开始在工作人员中再次运行。这是为什么?
答案 0 :(得分:0)
它取决于您在项目中使用的后端,revoke()仅适用于AMQP和Redis代理。
http://docs.celeryproject.org/en/latest/userguide/workers.html#remote-control
请注意,远程控制命令必须正常工作才能使撤销工作。 只有RabbitMQ(amqp)和支持远程控制命令 Redis就在这一点上。