Python AMQP/RabbitMQ有多个使用者,但只有一个获取工作?

Python AMQP/RabbitMQ有多个使用者,但只有一个获取工作?,python,rabbitmq,amqp,Python,Rabbitmq,Amqp,我正在学习AMQP,所以这可能是对我所做工作的误解。我正试图在我自己的私有服务器上设置rabbitmq,以便为一系列系统提供服务(我需要处理一堆映像)。我建立了一个三步管道: | put image on queue | --work_queue--> | process | --results--> | archive results | 我安装了rabbitmq,并在服务器上创建了两个队列。”“工作队列”和“结果”。我使用amqplib编写了一些python脚本,一个图像处理

我正在学习AMQP,所以这可能是对我所做工作的误解。我正试图在我自己的私有服务器上设置rabbitmq,以便为一系列系统提供服务(我需要处理一堆映像)。我建立了一个三步管道:

| put image on queue | --work_queue--> | process | --results--> | archive results | 
我安装了rabbitmq,并在服务器上创建了两个队列。”“工作队列”和“结果”。我使用amqplib编写了一些python脚本,一个图像处理器工作人员就可以很好地使用管道。我已经向队列中添加了100个图像,我的一台机器正在愉快地一次抓取一个图像,并在数据上翻滚,然后将结果放到结果队列中

问题是,我假设如果我在另一台机器上启动另一个映像处理,它也会将工作从队列中拉出来。这似乎正是rabbitmq站点上“工作队列”教程中列出的情况。我以为这会奏效。然而,真正发生的事情是,无论我启动了多少其他工人,他们只是永远等待,永远不会得到任何工作,即使有大量的消息等待在工作队列中

我误解了什么?将服务器上的工作排队的相关代码:

from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="foo:5672 ", userid="pipeline",
    password="XXXXX", virtual_host="/", insist=False)
chan = conn.channel()

....

msg = { 'filename': os.path.basename(i) }

chan.basic_publish(amqp.Message(json.dumps(msg)), exchange='',
        routing_key='work_queue')
以及流程工人的用户端:

from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="foo:5672 ", userid="pipeline",
    password="XXXXX", virtual_host="/", insist=False)
chan = conn.channel()

def work_callback(msg):
.... 

while True:
    chan.basic_consume(callback=work_callback, queue='work_queue')
    try:
        chan.wait()
    except KeyboardInterrupt:
        print "\nExiting cleanly"
        sys.exit(0)
我可以看到其他工人是相互联系的:

$ sudo rabbitmqctl list_queues
Listing queues ...
results 0
work_queue      246
...done.

$ sudo rabbitmqctl list_connections 
Listing connections ...
pipeline        192.168.8.1     41553   running
pipeline        XX.YY.ZZ.WW     46676   running
pipeline        192.168.8.4     44482   running
pipeline        192.168.8.6     41884   running
...done.
其中XX.YY.ZZ.WW是一个外部IP。192.168.8.6上的工作进程正在队列中翻滚,而外部IP上的工作进程却处于空闲状态,而有246条消息在它应该等待的队列中等待


想法?

很抱歉回答了我自己的问题,但我终于得到了我想要的行为。我需要将QoS预取计数设置为1。显然,通过不设置预回迁计数,一旦一个客户端连接,所有200多条消息都会被传递到它的“通道”并从队列中排出,因此,除非原来的工作断开连接(从而关闭通道并将消息放回队列),否则其他人看不到任何工作

加入:

chan.basic_qos(0,1,False)

对我的员工来说,他们现在一次只抓取一条信息。这并不完全是我所期望的,但它现在仍在按预期工作。

很吸引人。如果在我提交工作时两个“员工”都连接在一起,那么两个都在工作。甚至更奇怪的是,如果提交工作时只有一个连接在一起,就好像所有工作都安排好了如果另一个工人连接,只有当我杀死原来的工人时,它才能得到工作…然后新的工人得到大约一半的工作???如果我重新连接原来的工人,它会得到剩余的一半?奇怪!我希望工作被放在一个队列中,每个工人连接到队列,一次抓住第一个条目。它似乎把所有的工作都安排好了。也许我不明白队列和通道的区别?