有没有办法定义一个 RabbitMQ 消费者,在不阻塞程序的情况下持续监听队列?

问题描述 投票:0回答:1

我正在做一个项目,在Python中使用RabbitMq。最初,管理员验证一个订单,然后将其发布在 RabbitMq 消息队列“verified_orders”中,我希望有一个消费者持续侦听此 MQ,消费订单并将其详细信息发送回客户端,但不阻塞状态整个计划。

我看过 RabbitMQ 教程,在其中找到了这段代码 假设与 RabbitMQ 的连接已经建立

发布消息的代码

channel.basic_publish(exchange='',
                      routing_key='verified_orders',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

使用代码

def callback(ch, method, properties, body):
    print(f" [x] Received {body}")

channel.basic_consume(queue='verified_orders',
                      auto_ack=True,
                      on_message_callback=callback)

channel.start_consuming()

当执行start_consuming()时,它将无限等待数据并运行回调,但是程序将进入我试图避免的阻塞状态。

我发现的另一种方法是定义一个具有无限循环的异步函数来消费消息,但我不认为这是使用无限循环的好方法。

channel.basic_get(queue='verified_orders', auto_ack=True)
python rabbitmq message-queue
1个回答
0
投票

如果想要非阻塞程序,就必须使用并发。有两种实现方式,一种是使用

multi-threading
,另一种是
asynchronous programming

异步方法更加优化,因为您可以通过在单个线程内使用无限循环来实现您的目标。当您有 IO 绑定任务并且连接、消费或发布到 MQ 是 IO 绑定任务时,您也可以使用

async

据我从您的代码示例中了解到,您正在使用

pika
库。该库是作为同步实现的。您可以使用
aiopika
来代替,它提供
Rabbitmq
的所有异步功能。

© www.soinside.com 2019 - 2024. All rights reserved.