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

How to operate multiple ZeroMQ Socket Types In The Same Process?

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

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

我发现 this example 在同一进程中从多个套接字读取数据,但这似乎不是最佳选择,因为现在您不再阻塞等待消息,您会低效地不断检查消息并返回休眠状态。

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

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

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

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

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

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

还需要什么?

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

剩下的就交给你了。

许多"academic"示例可能看起来微不足道和简化,以便仅说明当前讨论的内容,或以某些狭隘的视角展示的功能。

在现实生活中并非如此。

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

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

的概率非零