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

时间:2017-03-07 14:48:26

标签: c++ zeromq blocking

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

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

我在同一个进程中发现了this example来自多个套接字的读取,但它似乎是次优的,因为现在你不再阻止等待消息,你无法有效地检查消息并重新进入休眠状态。

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

我很想知道解决此类问题的任何见解或例子。

1 个答案:

答案 0 :(得分:1)

欢迎分布式计算的本质!

是的,一旦为多代理域组装项目,就必须解决新的观点,其中多个流程可以工作并与其相应的对等点进行临时通信。

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

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

还需要什么?

嗯,只需要想象力和很多自律来遵守零拷贝,零共享和零阻塞设计格言。

剩下的就在你手中。

许多"学术"示例可能看似微不足道和简化,以便仅仅说明当前讨论的内容,或者从一些狭隘的角度展示的功能。 enter image description here

在现实生活中并非如此。

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

nota bene:应始终牢记,强大且具有错误恢复能力的系统应避免使用默认的REQ / REP可扩展形式通信模式,因为存在非falling the pairwise-stepped REQ/REP dual-FSA into an unsalvageable deadlockDo not hesitate to read more about this smart tool. )的概率为零。