Pika + RabbitMQ:将basic_qos设置为prefetch = 1仍然会消耗队列中的所有消息

时间:2012-09-14 14:51:14

标签: rabbitmq pika qos

我有一个python worker客户端,它会旋转10个worker,每个worker挂钩到RabbitMQ队列。有点像这样:

#!/usr/bin/python
worker_count=10

def mqworker(queue, configurer):
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='mqhost'))
    channel = connection.channel()
    channel.queue_declare(queue=qname, durable=True)
    channel.basic_consume(callback,queue=qname,no_ack=False)
    channel.basic_qos(prefetch_count=1)
    channel.start_consuming()


def callback(ch, method, properties, body):
    doSomeWork();
    ch.basic_ack(delivery_tag = method.delivery_tag)

if __name__ == '__main__':
    for i in range(worker_count):
        worker = multiprocessing.Process(target=mqworker)
        worker.start()

我遇到的问题是,尽管在频道上设置了basic_qos,但是第一个启动的工作人员接受队列中的所有消息,而其他人则闲置在那里。我可以在rabbitmq界面中看到这一点,即使我将worker_count设置为1并在队列中转储50条消息,所有50条消息都会进入“未确认”的桶中,而我希望1会成为未确认的消息。其他49人准备好了。

为什么这不起作用?

1 个答案:

答案 0 :(得分:16)

我似乎通过移动basic_qos被调用来解决这个问题。

channel = connection.channel()之后放置它会将行为改变为我期望的行为。