我正在使用芹菜+ rabbitmq。我找不到方便的方法来清除celery + rabbitmq中的队列。我这样做是删除并创建vhost。
rabbitmqctl delete_vhost <vhostpath>
rabbitmqctl add_vhost <vhostpath>
是否更喜欢清除一些芹菜队列?
答案 0 :(得分:13)
我不太确定celery是如何工作的,但我怀疑你想要清除一个RabbitMQ队列(你现在通过删除队列并让芹菜重新创建它们来模拟它)。
您可以安装RabbitMQ的Management Plugin。它的WebUI将允许您清除所需的队列。这也应该告诉你你想要的队列,所以你不需要删除所有队列。
一旦知道它是哪个队列,就可以以编程方式清除它。例如,使用py-amqplib,您可以执行以下操作:
from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/", insist=False)
conn = conn.channel()
conn.queue_purge("the-target-queue")
但是,可能有更好的方法。
答案 1 :(得分:2)
如果您遇到此问题,因为您使用rabbitmq作为结果后端,结果您排队太多,那么我建议使用不同的结果后端(redis或mongodb)
这是一个众所周知的芹菜缺陷。如果你是结果后端的amqp,它将为每个结果创建一个单独的队列。
如果您仍想坚持使用amqp作为结果后端。它将在24小时内清除。但是,您可以使用CELERY_AMQP_TASK_RESULT_EXPIRES
设置将其设置为较小的值。
答案 2 :(得分:1)
如果您需要删除队列中的所有项目(特别是当列表很长时)
1)将所有项目保存到文件中
sudo rabbitmqctl list_queues -p /yourvhost name > queues.txt
不要忘记从'queues.txt'中删除第一行和最后一行
2)使用提到的python代码来完成工作
from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="127.0.0.1:5672", userid="guest", password="guest", virtual_host="/yourvhost", insist=False)
conn = conn.channel()
queues = None
with open('queues.txt', 'r') as f:
queues = f.readlines()
for q in queues:
if q:
#print 'deleting %s' % q
conn.queue_purge(q.strip())
print 'purged %d items' % len(queues)