繁体   English   中英

如何在python中使用celery清除特定队列的所有任务?

[英]How to purge all tasks of a specific queue with celery in python?

如何在python中使用celery清除特定que的所有计划和运行任务? 问题看起来很简单,但补充一点,我不是在寻找命令行代码

我有以下行,它定义了que并希望清除该que来管理任务:

CELERY_ROUTES = {"socialreport.tasks.twitter_save": {"queue": "twitter_save"}}

在1个时间点我想使用python代码清除que twitter_save中的所有任务,也许是使用广播功能? 我找不到关于此的文档。 这可能吗?

只是为了更新@Sam Stoelinga对芹菜3.1的回答,现在可以在终端上这样做:

celery amqp queue.purge <QUEUE_NAME>

对于Django,请务必从manage.py文件启动它:

./manage.py celery amqp queue.purge <QUEUE_NAME> 

如果没有,请确保芹菜能够通过设置--broker=标志正确指向代理。

原始答案不适用于Celery 3.1。 如果您想从命令行执行此操作,Hassek的更新是正确的命令。 但是,如果您想以编程方式执行此操作,请执行以下操作:

假设您将Celery应用程序运行为:

celery_app = Celery(...)

然后:

import celery.bin.amqp
amqp = celery.bin.amqp.amqp(app = celery_app)
amqp.run('queue.purge', 'name_of_your_queue')

这对于您排队了大量任务的情况非常方便,而且一个任务遇到致命条件,您知道这会阻止其他任务执行。

例如,您排队了一堆网络爬虫任务,并且在您的任务中间,您的服务器的IP地址被阻止。 执行其余任务没有意义。 所以在这种情况下,你自己的任务可以清除自己的队列。

大声笑很容易,希望有人可以帮助我。

from celery.bin.camqadm import camqadm
camqadm('queue.purge', queue_name_as_string)

唯一的问题是我仍然需要在清除que之前停止celeryd,在清除之后我需要再次运行celeryd来处理队列的任务。 如果我成功,将更新此问题。

我成功了,但请纠正我,如果这不是一个很好的方法来阻止芹菜,清除阙并再次启动它。 我知道我正在使用术语,因为我实际上希望它终止任务。

kill_command =  "ps auxww | grep 'celeryd -n twitter_save' | awk '{print $2}' | xargs kill -9"
subprocess.call(kill_command, shell=True)

camqadm('queue.purge', 'twitter_save')
rerun_command = "/home/samos/Software/virt_env/twittersyncv1/bin/python %s/manage.py celeryd -n twitter_save -l info -Q twitter_save" % settings.PROJECT_ROOT

os.popen(rerun_command+' &')
send_task("socialreport.tasks.twitter_save")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM