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

时间:2011-10-27 15:23:29

标签: python django celery

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

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

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

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

3 个答案:

答案 0 :(得分:34)

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

celery amqp queue.purge <QUEUE_NAME>

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

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

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

答案 1 :(得分:7)

原始答案不适用于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')

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

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

答案 2 :(得分:6)

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

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")