Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有python的Rabbitmq工作异常_Python_Rabbitmq_Message Queue - Fatal编程技术网

带有python的Rabbitmq工作异常

带有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一起练习

但rabbimmq行为与官方网站上的教程不同

工作者
任务发送者
使用以下代码连接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)
...

它的工作,我会检查文件的更多细节,非常感谢。