带有python的Rabbitmq工作异常
我正在和rabbitmq一起练习 但rabbimmq行为与官方网站上的教程不同带有python的Rabbitmq工作异常,python,rabbitmq,message-queue,Python,Rabbitmq,Message Queue,我正在和rabbitmq一起练习 但rabbimmq行为与官方网站上的教程不同 工作者和任务发送者使用以下代码连接rabbitmq connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='task_queue') 和task\u发送方通过调用 for i in range(10)
工作者
和任务发送者
使用以下代码连接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue')
和task\u发送方
通过调用
for i in range(10):
message = "job%s %d %s" % (str(random.randint(1,10)), i , '.'*i)
channel.basic_publish(exchange='',
routing_key='task_queue',
body=message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))
而工作者
通过调用并等待一段时间来获取任务
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
time.sleep(body.count(b'.'))
print(" [x] Job Done!")
ch.basic_ack(delivery_tag = method.delivery_tag)
channel.basic_consume(callback,
queue='task_queue',
no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
首先,我运行task\u sender.py
发送十个作业,结果很顺利
但是,当我在不同的shell中启动两个worker.py
时,似乎只有一个worker在获取任务,而另一个worker什么也不做
更重要的是,当正在工作的工作者
完成队列中的所有作业时,我再次运行task\u sender.py
发送新任务,所有工作者
都不再获取作业
rabbitmq似乎正在阻塞,我如何解决这个问题
这是我的
欢迎提供任何帮助,提前感谢。我不确定pika的情况,但在使用oslo.messaging和rabbitmq作为后端时,我遇到了同样的问题。发生的情况是,通知消息的生产者发送了它,第一个捕获消息的侦听器(消费者)使用了它,而其他侦听器从未得到它 奥斯陆有一个“扇出”功能,它将通知消息发送到所有服务器,而不是“第一个赢家,其他输家”那种风格 我想皮卡可能也有类似的东西
尝试在此处搜索关键字“扇出”。然后您可以检查pika文档是否有类似的内容。希望这能有所帮助。在您的工作程序中,尝试将预回迁计数设置为合理的值,并将no\u ack设置为false:
...
channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
queue='task_queue',
no_ack=False)
...
它的工作,我会检查文件的更多细节,非常感谢。