c++ - 如何在同一个进程中操作多个 ZeroMQ 套接字类型?

标签 c++ zeromq blocking

我希望在我的嵌入式系统应用程序中使用 ZeroMQ 来促进 IPC,但是,我找不到很多关于在同一进程中使用多个 0MQ 套接字类型的示例。

例如,假设我有一个名为“antenna_mon”的进程来监视天线。我希望能够向此进程发送消息并获得响应 - 经典的 REQ-REP 模式。但是,我还有一个“cm”进程,用于向订阅者发布配置更改。我希望 antenna_mon 订阅天线配置更改 - PUB-SUB

我找到了 this example在同一个进程中从多个套接字读取,但它似乎不是最优的,因为现在你不再阻塞等待消息,你会低效地不断检查消息并返回 sleep 状态。

有没有人以前遇到过这个问题?我只是想错了吗?也许我应该有两个线程 - 一个用于 CM 更改,一个用于 REQ-REP 服务?

我会喜欢解决此类问题的任何见解或示例。

最佳答案

欢迎来到分布式计算的本质!

是的,一旦为多代理域组装一个项目,就会有新的观点需要解决,在该域中,多个进程工作并与其各自的对等点临时通信。

从软实时系统或嵌入式系统设计经验中获得的知识库在这里会有很大帮助。如果没有这样的可用,也可以从 GUI 设计中选择一些相似之处,其中的中心装饰品类似于轻量级 .mainloop() 调度程序,并且大部分艰苦的工作都嵌入到循环轮询的 GUI 设备中,内部状态更改或外部 ​​MMI 事件被编码到事件触发的处理程序中。

ZeroMQ 基础架构为此类非阻塞、可控可轮询(可扩展、可变或自适应临时可调轮询超时)提供了所需的所有工具,而不是克服给定的、设计定义的、往返持续时间 Controller .mainloop() )和与传输无关的、异步操作的消息调度程序(具有线程映射性能缩放和优先级调整)。

还需要什么?

好吧,只是想像力和大量的自律来遵守零复制、零共享和零阻塞设计准则。

剩下的就交给你了。

许多“学术”示例可能看起来微不足道和简化,以便仅说明当前讨论的内容,或以某些狭隘的视角展示的功能。 enter image description here

在现实生活中并非如此。

例如,我的分布式 ML 引擎使用多个 PUSH/PULL 的串联 用于移动状态数据更新传输和预测预测的管道 + 另一个 PUSH/PULL 用于远程键盘 + 反向 .bind()/.connect() PUB/SUB 用于将分布式代理的遥测数据轻松广播到远程集中操作的系统日志和一些额外的 PAIR/PAIR 管道,根据处理需要。

( nota bene: 应始终牢记,健壮且抗错的系统应避免使用默认的 REQ/REP 可扩展正式通信模式,因为没有- falling the pairwise-stepped REQ/REP dual-FSA into an unsalvageable deadlock 的概率为零。Do not hesitate to read more about this smart tool. )

关于c++ - 如何在同一个进程中操作多个 ZeroMQ 套接字类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651267/

相关文章:

c++ - zeromq c 识别客户端

c++ - 有没有办法在不使用 MPI_Wait 的情况下编写非阻塞 MPI 代码?

java - Akka actor 的 Bulkheading 策略

c++ - TBB 并发 vector 是否支持旧的 C 风格循环?

c++ - 使用 setw 和 setfill 输出格式化

zeromq 和 bind_to_random_port - 如何选择端口

python - Zeromq:为什么经销商发送一条消息并从一个客户接收消息?

user-interface - wxpython 使用 time.sleep() 不阻塞完整的 GUI

c++ - #define 字符串的类型是什么?

c++ - 是否使用枚举类来标记未定义的行为?