【发布时间】:2011-09-03 11:51:10
【问题描述】:
我正在使用 celery+rabbitmq。我找不到方便的方法来清除 celery+rabbitmq 中的队列。我通过删除并创建虚拟主机来做到这一点。
rabbitmqctl delete_vhost <vhostpath>
rabbitmqctl add_vhost <vhostpath>
是清除一些芹菜队列的首选方法吗?
【问题讨论】:
我正在使用 celery+rabbitmq。我找不到方便的方法来清除 celery+rabbitmq 中的队列。我通过删除并创建虚拟主机来做到这一点。
rabbitmqctl delete_vhost <vhostpath>
rabbitmqctl add_vhost <vhostpath>
是清除一些芹菜队列的首选方法吗?
【问题讨论】:
我不太确定 celery 是如何工作的,但我怀疑你想清除一个 RabbitMQ 队列(你目前正在通过删除队列并让 celery 重新创建它们来模拟这个)。
你可以安装 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")
不过,可能有更好的方法。
【讨论】:
如果您因为使用 rabbitmq 作为结果后端而遇到这个问题,结果队列太多,那么我建议您使用不同的结果后端(redis 或 mongodb)
这是芹菜的一个众所周知的缺陷。如果您为结果后端 amqp,它将为每个结果创建一个单独的队列。
如果您仍想坚持使用 amqp 作为结果后端。它会在 24 小时内自行清除。但是,您可以使用 CELERY_AMQP_TASK_RESULT_EXPIRES 设置将其设置为较小的值。
【讨论】:
如果您需要删除队列中的所有项目(尤其是当列表很长时)
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)
【讨论】: