用Pika执行单个阻止,同步接收的正确方法是什么?

时间:2019-01-10 19:11:39

标签: rabbitmq amqp pika

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

选项A:basic_get

basic_get的{​​{1}}方法可以接收消息,但是如果没有消息可接收,它将立即返回。这就像禁用了阻塞的套接字BlockingConnection调用。我可以将这种方法与超时一起使用来连续轮询,但这效率不高。

选项B:recv

basic_consume的{​​{1}}方法可以完成这项工作,但是它有一个奇怪的要求,就是我basic_consume本身必须位于线程中的其他位置。由于我的BlockingConnection方法的调用者已经期望阻塞并等待消息,所以这似乎是在浪费线程。

Pika是否有可能做start_consuming()的等价物?

2 个答案:

答案 0 :(得分:0)

在自己的线程上运行Pika,并在basic_consume上运行预取值1(如果您一次确实想要一条消息)。将消息插入您的呼叫者可以阻止的某种同步数据结构中。

请务必正确确认来自其他线程(example)的消息


注意: RabbitMQ团队监视the rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

答案 1 :(得分:0)

使用此示例中的频道的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的元素是消息的正文。