撤销芹菜的任务

时间:2016-08-28 12:23:55

标签: python rabbitmq celery

我想从芹菜中明确撤销任务。这就是我目前正在做的事情: -

from celery.task.control import revoke

revoke(task_id, terminate=True)

其中task_id为string(也尝试将其转换为UUID uuid.UUID(task_id).hex)

在上述过程之后,当我再次启动芹菜celery worker -A proj时,它仍会消耗相同的消息并开始处理它。为什么呢?

通过flower查看时,消息仍在代理部分中。如何删除邮件以使其无法再次使用?

1 个答案:

答案 0 :(得分:19)

revoke如何运作?

当调用revoke方法时,任务不会立即从队列中删除,它所做的只是告诉芹菜(而不是你的经纪人!)将task_id保存在 - 记忆set(如果您喜欢像我一样阅读源代码,请查看here。)

当任务到达队列的顶部时,Celery将检查它是否在撤销的集合中,如果是,它将不会执行它。

它以这种方式阻止O(n)搜索每个revoke调用,其中检查task_id是否在内存集中只是O(1)

为什么重新启动芹菜后,你的被撤销任务被执行了?

了解事情是如何运作的,你现在知道set只是一个普通的python集,被保存在内存中 - 这意味着当你重新启动时,你会失去这个集合,但任务是(当然)持久性,当任务转向时,它将正常执行。

你能做什么?

你需要有一个持久性设置,这可以通过你的工作人员这样做来完成:

celery worker -A proj --statedb=/var/run/celery/worker.state

这将保存文件系统上的设置。

参考文献: