Python 撤销芹菜中的任务

Python 撤销芹菜中的任务,python,rabbitmq,celery,Python,Rabbitmq,Celery,我想从芹菜中明确撤销一项任务。这就是我目前所做的:- from celery.task.control import revoke revoke(task_id, terminate=True) 其中task_id是字符串(也尝试将其转换为UUIDUUID.UUID(task_id.hex) 在完成上述步骤后,当我再次启动芹菜芹菜工人-A proj时,它仍然使用相同的消息并开始处理它。为什么? 通过flower查看时,消息仍在broker部分。如何删除邮件,使其不能再次使用?如何执行revo

我想从芹菜中明确撤销一项任务。这就是我目前所做的:-

from celery.task.control import revoke

revoke(task_id, terminate=True)
其中task_id是
字符串
(也尝试将其转换为UUID
UUID.UUID(task_id.hex)

在完成上述步骤后,当我再次启动芹菜
芹菜工人-A proj
时,它仍然使用相同的消息并开始处理它。为什么?

通过
flower
查看时,消息仍在broker部分。如何删除邮件,使其不能再次使用?

如何执行
revoke
操作? 调用
revoke
方法时,任务不会立即从队列中删除,它所做的只是告诉芹菜(不是你的经纪人!)将
task\u id
保存在内存
set
(看看你是否喜欢像我一样阅读源代码)

当任务到达队列的顶端时,芹菜将检查它是否在撤销集中,如果在撤销集中,它将不执行它

它通过这种方式防止对每个
revoke
调用进行O(n)搜索,其中检查任务id是否在内存集中仅为O(1)

为什么重启芹菜后,你撤销的任务会被执行? 了解了工作原理后,您现在知道
只是一个普通的python集,它被保存在内存中——这意味着当您重新启动时,您将丢失该集,但任务(当然)是持久性的,当任务轮到时,它将正常执行

你能做什么? 您需要有一个持久性集,这是由您的初始工作人员完成的,如下所示:

芹菜工人-A项目--statedb=/var/run/芹菜/worker.state

这将在文件系统上保存该集

参考资料:


您使用了多少工人?撤销任务的工作方式是向所有工作人员发送广播消息,然后工作人员在内存中保留已撤销任务的列表。当工作进程启动时,它将与群集中的其他工作进程同步已撤销的任务。我一直在尝试
revoke()
一个任务,但它实际上是执行的,尽管它被标记为已撤销:有什么想法我可能会错过吗?revoke还需要状态参数,我不知道它是什么?你知道吗?