Python AMQP/RabbitMQ有多个使用者,但只有一个获取工作?
我正在学习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脚本,一个图像处理
| 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)
对我的员工来说,他们现在一次只抓取一条信息。这并不完全是我所期望的,但它现在仍在按预期工作。很吸引人。如果在我提交工作时两个“员工”都连接在一起,那么两个都在工作。甚至更奇怪的是,如果提交工作时只有一个连接在一起,就好像所有工作都安排好了如果另一个工人连接,只有当我杀死原来的工人时,它才能得到工作…然后新的工人得到大约一半的工作???如果我重新连接原来的工人,它会得到剩余的一半?奇怪!我希望工作被放在一个队列中,每个工人连接到队列,一次抓住第一个条目。它似乎把所有的工作都安排好了。也许我不明白队列和通道的区别?