删除celery / rabbitmq中所有待处理的任务


Answers:


296

文档

$ celery -A proj purge

要么

from proj.celery import app
app.control.purge()

(编辑:使用当前方法更新。)


56
或者,对于celery 3.0+,从Django开始manage.py celery purgeceleryctl现在已弃用,并且将在3.1中消失)。
Henrik Heimbuerger 2013年

3
我找到了这个答案,寻找如何使用Redis后端。我发现的最好方法是redis-cli KEYS "celery*" | xargs redis-cli DEL对我有用。这将清除您正在使用的Redis后端上存储的所有任务。
Melignus

1
我如何在celery 3.0中做到这一点?
luistm

2
对我来说,这很简单celery purge(在相关的虚拟环境中)。糟糕-以下是与之相同的答案..... stackoverflow.com/a/20404976/1213425
Erve1879 2014年

对于与Django结合使用的Celery 4.0+,再次使用此命令,其中的参数-A是所在的Django应用celery.py
gitaarik '17

120

对于芹菜3.0+:

$ celery purge

要清除特定队列:

$ celery -Q queue_name purge

9
如果出现连接错误,请确保指定应用程序,例如celery -A proj purge
卡米尔·辛迪

25

对于Celery 2.x和3.x:

例如,当使用带有-Q参数的worker来定义队列时

celery worker -Q queue1,queue2,queue3

celery purge无法使用,因为您无法将队列参数传递给它。它只会删除默认队列。解决方案是使用以下--purge参数启动您的工作程序:

celery worker -Q queue1,queue2,queue3 --purge

但是,这将使工人工作。

另一种选择是使用celery的amqp子命令

celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3

是的,这适用于较旧的(2.x或3.x)芹菜版本。我无法编辑答案
smido


9

我发现这celery purge不适用于我更复杂的celery配置。我将多个命名队列用于不同目的:

$ sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ...  # Output sorted, whitespaced for readability
celery                                          0   2
celery@web01.celery.pidbox                      0   1
celery@web02.celery.pidbox                      0   1
apns                                            0   1
apns@web01.celery.pidbox                        0   1
analytics                                       1   1
analytics@web01.celery.pidbox                   0   1
bcast.361093f1-de68-46c5-adff-d49ea8f164c0      0   1
bcast.a53632b0-c8b8-46d9-bd59-364afe9998c1      0   1
celeryev.c27b070d-b07e-4e37-9dca-dbb45d03fd54   0   1
celeryev.c66a9bed-84bd-40b0-8fe7-4e4d0c002866   0   1
celeryev.b490f71a-be1a-4cd8-ae17-06a713cc2a99   0   1
celeryev.9d023165-ab4a-42cb-86f8-90294b80bd1e   0   1

第一列是队列名称,第二列是队列中等待的消息数,第三列是该队列的侦听器数。队列是:

  • 芹菜-排队执行标准的幂等芹菜任务
  • apns-排队执行Apple Push Notification Service任务,而不是幂等
  • 分析-排队进行长期运行的夜间分析
  • * .pidbox-队列中的工作程序命令,例如关机和重置,每个工作程序一个(2个芹菜工作程序,一个apns工作程序,一个分析工作程序)
  • bcast。*-广播队列,用于向所有正在听队列的工作人员发送消息(而不只是第一个抓取该消息的人)
  • celeryev。*-Celery事件队列,用于报告任务分析

分析任务是一项蛮力任务,在处理小型数据集时效果很好,但现在需要24多个小时才能完成。有时,某些地方会出错,并且会在数据库上等待。它需要重新编写,但是在此之前,当它卡住时,我终止了该任务,清空了队列,然后重试。我通过查看分析队列的消息计数来检测“阻塞”,该消息计数应为0(完成分析)或1(等待昨晚的分析完成)。2或更高是不好的,我收到一封电子邮件。

celery purge 提供从一个广播队列中删除任务的功能,但我看不到选择其他命名队列的选项。

这是我的过程:

$ sudo /etc/init.d/celeryd stop  # Wait for analytics task to be last one, Ctrl-C
$ ps -ef | grep analytics  # Get the PID of the worker, not the root PID reported by celery
$ sudo kill <PID>
$ sudo /etc/init.d/celeryd stop  # Confim dead
$ python manage.py celery amqp queue.purge analytics
$ sudo rabbitmqctl list_queues -p celery name messages consumers  # Confirm messages is 0
$ sudo /etc/init.d/celeryd start

虽然没有答案,对吗?但是非常有用!
2015年

4
celeryctl purge不适用于命名队列。 python manage.py celery amqp queue.purge <queue_name>做到了。我认为上下文对于具有复杂设置的用户很有用,因此他们可以弄清楚如果celeryctl purge失败了该怎么办。
jwhitlock 2015年

manage.py在芹菜3.1.17中找不到文件是否已删除或只是新文件?我在中找到了对应的界面(queue.purge*/bin/amqp.py。但是,在尝试将文件的内容与文档相关联之后,我必须遗憾地承认,Celery没有文档化的痛苦,也是一件非常复杂的工作,至少从其源代码来看。
2015年

manage.py是Django管理脚本,manage.py celery在从Django设置加载配置后运行celery。我没有在Django之外使用celery,但是其中包含的celery命令可能正是您要查找的:celery.readthedocs.org/en/latest/userguide/monitoring.html
jwhitlock 2015年

5

在芹菜中3+

http://docs.celeryproject.org/en/3.1/faq.html#how-do-i-purge-all-waiting-tasks

命令行界面

清除命名队列:

 celery -A proj amqp queue.purge <queue name>

清除配置的队列

celery -A proj purge

我已清除邮件,但是队列中是否还有邮件?答案:任务在实际执行后即被确认(从队列中删除)。工作人员收到任务后,将需要一段时间才能真正执行它,特别是如果有很多任务正在等待执行时。直到关闭与代理(AMQP服务器)的连接之前,工作人员会保留未确认的消息。当该连接关闭时(例如,由于工作进程被停止),代理将把任务重新发送给下一个可用的工作进程(或重新启动时是同一工作进程),以便正确清除等待任务的队列必须停止所有工作程序,然后使用celery.control.purge()清除任务。

因此要清除整个队列,必须停止工作者。


5

如果要删除所有待处理的任务以及活动和保留的任务以完全停止Celery,这对我有用:

from proj.celery import app
from celery.task.control import inspect, revoke

# remove pending tasks
app.control.purge()

# remove active tasks
i = inspect()
jobs = i.active()
for hostname in jobs:
    tasks = jobs[hostname]
    for task in tasks:
        revoke(task['id'], terminate=True)

# remove reserved tasks
jobs = i.reserved()
for hostname in jobs:
    tasks = jobs[hostname]
    for task in tasks:
        revoke(task['id'], terminate=True)

2

1.要正确清除等待任务的队列,您必须停止所有工作人员(http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-仍然在队列中的消息):

$ sudo rabbitmqctl stop

或(如果RabbitMQ /消息代理由主管管理):

$ sudo supervisorctl stop all

2. ...然后从特定队列中清除任务:

$ cd <source_dir>
$ celery amqp queue.purge <queue name>

3.启动RabbitMQ:

$ sudo rabbitmqctl start

或者(如果RabbitMQ由Supervisor管理):

$ sudo supervisorctl start all

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.