Answers:
redis-cli KEYS "celery*" | xargs redis-cli DEL
对我有用。这将清除您正在使用的Redis后端上存储的所有任务。
celery purge
(在相关的虚拟环境中)。糟糕-以下是与之相同的答案..... stackoverflow.com/a/20404976/1213425
-A
是所在的Django应用celery.py
。
例如,当使用带有-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
在芹菜3+中:
CLI:
$ celery -A proj purge
以编程方式:
>>> from proj.celery import app
>>> app.control.purge()
http://docs.celeryproject.org/en/latest/faq.html#how-do-i-purge-all-waiting-tasks
我发现这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
第一列是队列名称,第二列是队列中等待的消息数,第三列是该队列的侦听器数。队列是:
分析任务是一项蛮力任务,在处理小型数据集时效果很好,但现在需要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
celeryctl purge
不适用于命名队列。 python manage.py celery amqp queue.purge <queue_name>
做到了。我认为上下文对于具有复杂设置的用户很有用,因此他们可以弄清楚如果celeryctl purge
失败了该怎么办。
manage.py
在芹菜3.1.17中找不到文件是否已删除或只是新文件?我在中找到了对应的界面(queue.purge
)*/bin/amqp.py
。但是,在尝试将文件的内容与文档相关联之后,我必须遗憾地承认,Celery没有文档化的痛苦,也是一件非常复杂的工作,至少从其源代码来看。
manage.py
是Django管理脚本,manage.py celery
在从Django设置加载配置后运行celery。我没有在Django之外使用celery,但是其中包含的celery
命令可能正是您要查找的:celery.readthedocs.org/en/latest/userguide/monitoring.html
在芹菜中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()清除任务。
因此要清除整个队列,必须停止工作者。
如果要删除所有待处理的任务以及活动和保留的任务以完全停止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)
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
celery 4+ celery purge命令清除所有已配置的任务队列
celery -A *APPNAME* purge
以编程方式:
from proj.celery import app
app.control.purge()
所有待处理的任务将被清除。参考:celerydoc
manage.py celery purge
(celeryctl
现在已弃用,并且将在3.1中消失)。