【问题标题】:celery+rabbitmq empty queuecelery+rabbitmq 空队列
【发布时间】:2011-09-03 11:51:10
【问题描述】:

我正在使用 celery+rabbitmq。我找不到方便的方法来清除 celery+rabbitmq 中的队列。我通过删除并创建虚拟主机来做到这一点。

rabbitmqctl delete_vhost <vhostpath>
rabbitmqctl  add_vhost <vhostpath>

是清除一些芹菜队列的首选方法吗?

【问题讨论】:

    标签: rabbitmq celery


    【解决方案1】:

    我不太确定 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")
    

    不过,可能有更好的方法。

    【讨论】:

    【解决方案2】:

    如果您因为使用 rabbitmq 作为结果后端而遇到这个问题,结果队列太多,那么我建议您使用不同的结果后端(redis 或 mongodb)

    这是芹菜的一个众所周知的缺陷。如果您为结果后端 amqp,它将为每个结果创建一个单独的队列。

    如果您仍想坚持使用 amqp 作为结果后端。它会在 24 小时内自行清除。但是,您可以使用 CELERY_AMQP_TASK_RESULT_EXPIRES 设置将其设置为较小的值。

    【讨论】:

      【解决方案3】:

      如果您需要删除队列中的所有项目(尤其是当列表很长时)

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2011-05-08
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        相关资源
        最近更新 更多