首页 > 解决方案 > 使用 Pika 执行单个阻塞同步接收的正确方法是什么?

问题描述

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

选项 A:basic_get

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

选项 B:basic_consume

basic_consume方法BlockingConnection可以完成这项工作,但它有一个奇怪的要求,即我在start_consuming()其他地方有一个单独的线程。由于我的receive方法的调用者已经期望阻塞,等待消息,这似乎是在浪费线程。

Pika 是否有可能做相当于socket.recv(blocking=True)

标签: rabbitmqamqppika

解决方案


在它自己的线程上运行 Pika,并且basic_consume预取值为 1(如果你真的想要一次只接收一条消息)。将消息插入到调用者可以阻止的某种同步数据结构中。

确保从其他线程正确确认您的消息(示例


注意: RabbitMQ 团队会监控邮件列表rabbitmq-users有时只会在 StackOverflow 上回答问题。


推荐阅读