如何使用 redis 代理从 celery 中删除任务?
Posted
技术标签:
【中文标题】如何使用 redis 代理从 celery 中删除任务?【英文标题】:how to remove task from celery with redis broker? 【发布时间】:2013-06-15 13:47:32 【问题描述】:我用 redis broker
在celery
中添加了一些错误的task
但现在我想删除不正确的task
,但我找不到任何方法来做到这一点
是否有一些命令或一些 api 可以做到这一点?
【问题讨论】:
看看有没有帮助:***.com/questions/2557424/… 【参考方案1】:最简单的方法是使用celery control revoke [id1 [id2 [... [idN]]]]
(也不要忘记传递-A project.application
标志)。其中 id1 到 idN 是任务 ID。但是,出于正当理由,并不保证每次运行都会成功...
当然 Celery 有它的 API。这是一个如何从脚本执行此操作的示例:res = app.control.revoke(task_id, terminate=True)
在上面的示例中,app
是 Celery 应用程序的一个实例。
在极少数情况下,上面的控制命令不起作用,在这种情况下,您必须指示 Celery worker 杀死工作进程:res = app.control.revoke(task_id, terminate=True, signal='SIGKILL')
【讨论】:
【参考方案2】:尝试删除 .state 文件,如果您使用的是 beat worker (celery worker -B),那么也要删除调度文件
【讨论】:
我删除了所有状态和计划,然后删除了队列,它对我有用【参考方案3】:1。 要正确清除等待任务的队列,您必须停止所有工作人员 (http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue):
2 ...然后从特定队列中清除任务:
$ cd <source_dir
$ celery amqp queue.purge <queue name>
3。 重新启动工人
【讨论】:
【参考方案4】:我只是遇到了这个问题,所以对于未来的读者来说,
http://celery.readthedocs.org/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue
所以要正确清除等待任务的队列,您必须停止所有 工人,然后使用 celery.control.purge() 清除任务。
【讨论】:
再一次,就像公认的“答案”一样——这个也是不正确的。问题是如何撤销特定任务,而不是如何清除队列......【参考方案5】:我知道这样做的两种方法:
1) 直接从代理中删除队列。在你的情况下,它是 Redis。有两个命令可以帮助您:llen (查找正确的队列)和 del (删除它)。
2) 使用 --purge 或 --discard 选项启动 celery worker。这是帮助:
--purge, --discard Purges all waiting tasks before the daemon is started.
**WARNING**: This is unrecoverable, and the tasks will
be deleted from the messaging server.
【讨论】:
感谢重播,celery 太复杂了,我已经把我的项目改成 python-rq 它对我不起作用。 Reddis 仍然有所有队列,我无法删除它。 Celery 继续接收任务 如果这不能解决你所有的芹菜问题,我也鼓励你使用ps
检查僵尸进程并在它们上运行kill
。
这不是正确的答案。为什么会被接受?以上是关于如何使用 redis 代理从 celery 中删除任务?的主要内容,如果未能解决你的问题,请参考以下文章
由于回复 pidboxes,Redis 在用作 Celery 代理时占用了大量内存
使用 Redis 作为 Celery 结果后端和消息代理 - 任务过期(对于存储在 redis 中的密钥)