如何在python中使用celery清除特定que的所有计划和运行任务?问题似乎很简单,但要补充一点,我不是在寻找命令行代码
我有以下行,它定义了que并希望清除该que来管理任务:
CELERY_ROUTES = {"socialreport.tasks.twitter_save": {"queue": "twitter_save"}}
在1个时间点我想使用python代码清除que twitter_save中的所有任务,可能还有广播功能?我找不到关于此的文档。这可能吗?
答案 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")