18

それぞれがRabbitMQキューにフックする10個のワーカーを起動するPythonワーカークライアントがあります。このようなビット:

#!/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インターフェースで確認できます。1に設定worker_countして50個のメッセージをキューにダンプした場合でも、50個すべてが「未確認」バケットに入れられますが、1個は未確認になり、他の49個は準備。

なぜこれが機能しないのですか?

4

1 に答える 1

25

basic_qosが呼び出される場所を移動することで、これを解決したようです。

直後に配置するとchannel = connection.channel()、動作が期待どおりに変化するように見えます。

于 2012-09-14T14:55:22.893 に答える