我想以类似于标准套接字的模式使用Pika / RabbitMQ:也就是说,建立连接,然后在每次准备好做更多工作时进行阻塞同步调用以接收单个消息。
选项A:basic_get
BlockingConnection
的basic_get
方法提供了接收消息的能力,但如果没有消息可供接收,它会立即返回。这就像一个禁用阻塞的套接字recv
调用。我可以使用这种带超时的方法来连续轮询,但这效率不高。
选项B:basic_consume
BlockingConnection
的basic_consume
方法可以完成这项工作,但它有一个奇怪的要求,即我必须将start_consuming()
放在其他地方,单独放在一个线程中。由于我的receive
方法的调用者已经期望阻塞,等待消息,这似乎是浪费线程。
Pika有可能做socket.recv(blocking=True)
的等价物吗?
2条答案
按热度按时间rslzwgfq1#
使用通道的basic_get方法,如下例所示:
inmessage是3个元素的元组,索引为2的元素是消息的主体。
k3fezbri2#
在自己的线程上运行Pika,并使用预取值1运行
basic_consume
(如果您真的希望一次只运行一条消息)。将消息插入到某种同步数据结构中,您的调用者可以在该结构上进行阻塞。确保正确确认来自其他线程的消息(example)