rabbitmq 使用Pika执行单一阻塞同步接收的正确方法是什么?

ijxebb2r  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(2)|浏览(137)

我想以类似于标准套接字的模式使用Pika / RabbitMQ:也就是说,建立连接,然后在每次准备好做更多工作时进行阻塞同步调用以接收单个消息。

选项A:basic_get

BlockingConnectionbasic_get方法提供了接收消息的能力,但如果没有消息可供接收,它会立即返回。这就像一个禁用阻塞的套接字recv调用。我可以使用这种带超时的方法来连续轮询,但这效率不高。

选项B:basic_consume

BlockingConnectionbasic_consume方法可以完成这项工作,但它有一个奇怪的要求,即我必须将start_consuming()放在其他地方,单独放在一个线程中。由于我的receive方法的调用者已经期望阻塞,等待消息,这似乎是浪费线程。
Pika有可能做socket.recv(blocking=True)的等价物吗?

rslzwgfq

rslzwgfq1#

使用通道的basic_get方法,如下例所示:

credentials = pika.PlainCredentials('username', 'password')
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', credentials=credentials))
channel = connection.channel()

inmessage = channel.basic_get("your_queue_name", auto_ack=True)

inmessage是3个元素的元组,索引为2的元素是消息的主体。

k3fezbri

k3fezbri2#

在自己的线程上运行Pika,并使用预取值1运行basic_consume(如果您真的希望一次只运行一条消息)。将消息插入到某种同步数据结构中,您的调用者可以在该结构上进行阻塞。
确保正确确认来自其他线程的消息(example

相关问题