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是字符串
(也尝试将其转换为UUIDUUID.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还需要状态参数,我不知道它是什么?你知道吗?