celery + rabbitmq空队列

时间:2011-09-03 11:51:10

标签: rabbitmq celery

我正在使用芹菜+ rabbitmq。我找不到方便的方法来清除celery + rabbitmq中的队列。我这样做是删除并创建vhost。

rabbitmqctl delete_vhost <vhostpath>
rabbitmqctl  add_vhost <vhostpath>

是否更喜欢清除一些芹菜队列?

3 个答案:

答案 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)