rabbitmq - 使用 Pika 执行单个阻塞同步接收的正确方法是什么?
问题描述
我想以类似于标准套接字的模式使用 Pika / RabbitMQ:即建立连接,然后在每次我准备好做更多工作时进行阻塞同步调用以接收一条消息。
选项 A:basic_get
的basic_get
方法BlockingConnection
提供了接收消息的能力,但如果没有可接收的消息,它会立即返回。这就像一个recv
禁用阻塞的套接字调用。我可以使用这种带有超时的方法来连续轮询,但这效率不高。
选项 B:basic_consume
的basic_consume
方法BlockingConnection
可以完成这项工作,但它有一个奇怪的要求,即我在start_consuming()
其他地方有一个单独的线程。由于我的receive
方法的调用者已经期望阻塞,等待消息,这似乎是在浪费线程。
Pika 是否有可能做相当于socket.recv(blocking=True)
?
解决方案
在它自己的线程上运行 Pika,并且basic_consume
预取值为 1(如果你真的想要一次只接收一条消息)。将消息插入到调用者可以阻止的某种同步数据结构中。
确保从其他线程正确确认您的消息(示例)
注意: RabbitMQ 团队会监控邮件列表,rabbitmq-users
有时只会在 StackOverflow 上回答问题。
推荐阅读
- go - 如何将参数传递给 dlv 调试
- python - 我如何在 kivy 的 gui 中顺利加载文本
- unity3d - Unity - 如何在运行时更改 AnimationClip KeyFrame 值
- c++ - 在 C++ 中将 double 保存为二进制文件的问题
- reactjs - 如何修复:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头
- database - 我在 Pentaho 上丢失了一个文件,我该如何找回它?
- javascript - 哪个更快?`array.findIndex` vs `array.reduce` + `object[index]`
- html - 是否可以重新定位进入另一个使用引导程序?
- c++ - 如何在 C++ 中统一接口不同的数据类型
- algorithmic-trading - 如何找到烛台形态在 2 小时到 15 分钟时间范围内出现的最大次数