Pyt*_*ast 16 python rabbitmq celery
我想明确撤销芹菜的任务.这就是我目前的做法: -
from celery.task.control import revoke
revoke(task_id, terminate=True)
Run Code Online (Sandbox Code Playgroud)
task_id在哪里string
(也尝试将其转换为UUID uuid.UUID(task_id).hex)
.
在上述过程之后,当我再次启动芹菜时,celery worker -A proj
它仍会消耗相同的消息并开始处理它.为什么?
查看时flower
,消息仍在代理部分中.如何删除邮件以使其无法再次使用?
Or *_*uan 24
revoke
?在调用revoke
方法时,任务不会立即从队列中删除,它所做的只是告诉芹菜(而不是你的经纪人!)将其保存task_id
在内存中set
(如果你喜欢阅读像我这样的源代码,请查看此处).
当任务到达队列的顶部时,Celery将检查它是否在撤销的集合中,如果是,它将不会执行它.
它以这种方式工作以防止O(n)搜索每个revoke
调用,其中检查task_id是否在内存集中只是O(1)
理解事物是如何工作的,你现在知道它set
只是一个普通的python集,它被保存在内存中 - 这意味着当你重新启动时,你会丢失这个集合,但是任务是(当然)持久性,当任务转向时,它将正常执行.
你需要有一个持久性设置,这是通过你的工人初始化完成的:
celery worker -A proj --statedb=/var/run/celery/worker.state
这将保存文件系统上的设置.
参考文献:
归档时间: |
|
查看次数: |
7292 次 |
最近记录: |