如何使用redis经纪人从芹菜中删除任务?

时间:2013-06-19 06:25:14

标签: python celery celery-task celeryd

我使用redis task

celery添加了一些错误的broker

但现在我想删除不正确的task,我找不到任何方法来执行此操作

是否有一些命令或一些API来执行此操作?

5 个答案:

答案 0 :(得分:23)

我知道两种方法:

1)直接从代理删除队列。在你的情况下,它是Redis。有两个命令可以帮助您: llen (找到正确的队列)和 del (删除它)。

2)使用 - 清除 - 丢弃选项启动芹菜工作者。这是帮助:

--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.

答案 1 :(得分:2)

我刚才有这个问题,以供将来的读者使用,

http://celery.readthedocs.org/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue

  

所以要正确清除等待任务的队列,你必须停止所有   工作人员,然后使用celery.control.purge()清除任务。

答案 2 :(得分:1)

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。 再次启动工人

答案 3 :(得分: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终止该worker进程:res = app.control.revoke(task_id, terminate=True, signal='SIGKILL')

答案 4 :(得分:0)

尝试删除.state文件,如果您使用的是节拍工作程序(celery worker -B),则也要删除计划文件