撤销芹菜的任务

2024-04-26 14:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想明确撤销芹菜的任务。我现在就是这样做的:

from celery.task.control import revoke

revoke(task_id, terminate=True)

其中任务id是string(还尝试将其转换为UUIDuuid.UUID(task_id).hex))。

经过上述步骤后,当我再次启动芹菜时,它仍然会使用相同的消息并开始处理它。为什么?

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


Tags: fromimportidtrue消息taskstringuuid
1条回答
网友
1楼 · 发布于 2024-04-26 14:08:40

revoke是如何工作的?

调用revoke方法时,任务不会立即从队列中删除,它只会告诉芹菜(而不是您的代理!)将task_id保存在内存中set(如果您喜欢像我这样阅读源代码,请查看here)。

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

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

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

理解了事情的工作原理,您现在知道set只是一个普通的python集合,它被保存在内存中-这意味着当您重新启动时,您将丢失这个集合,但任务是(当然)持久性的,当任务轮到时,它将正常执行。

你能做什么?

您需要设置一个持久性,这是由您的初始工作人员完成的,如下所示:

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

这将在文件系统上保存集合。

参考文献:

相关问题 更多 >