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

C++ 如何在同一进程中操作多个ZeroMQ套接字类型?,c++,zeromq,blocking,C++,Zeromq,Blocking,我希望在我的嵌入式系统应用程序中使用ZeroMQ来促进IPC,但是,我找不到在同一过程中使用多个0MQ套接字类型的许多示例 例如,假设我有一个名为“antenna\u mon”的进程来监视天线。我希望能够向该流程发送消息并获得回复-一种经典的REQ-REP模式。但是,我还有一个“cm”过程,它将配置更改发布到订阅服务器。我希望天线\u mon也订阅天线配置更改-PUB-SUB 我发现,在同一个过程中,从多个套接字读取数据的效率很低,但这似乎是次优的,因为现在您不再阻止等待消息,而是不断低效地检查

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

例如,假设我有一个名为“
antenna\u mon
”的进程来监视天线。我希望能够向该流程发送消息并获得回复-一种经典的
REQ-REP
模式。但是,我还有一个“
cm
”过程,它将配置更改发布到订阅服务器。我希望
天线\u mon
也订阅天线配置更改-
PUB-SUB

我发现,在同一个过程中,从多个套接字读取数据的效率很低,但这似乎是次优的,因为现在您不再阻止等待消息,而是不断低效地检查消息,然后返回睡眠状态

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

我希望有任何关于解决这类问题的见解或例子。

欢迎来到分布式计算的本质! 是的,一旦为一个多代理领域组装了一个项目,其中有多个流程可以工作并与相应的对等方进行即席通信,就必须解决一些新的观点

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

ZeroMQ infrastructure为此类非阻塞、可控制轮询(可伸缩、可变或自适应即席可调轮询超时)和传输不可知、异步操作的控制器提供了所需的所有工具,而不是克服给定的、设计定义的往返持续时间,消息调度程序(具有线程映射的性能扩展和优先级调整)

你还需要什么? 好吧,只是想象力和很多自律来坚持零拷贝、零共享和零阻塞的设计准则

剩下的就交给你了

许多“学术”示例可能看起来琐碎和简化,以便仅说明当前讨论的内容,或从狭隘的角度演示的功能。

在现实生活中并非如此

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


nota bene:我们应该始终记住,健壮和容错的系统应该避免使用默认的REQ/REP可伸缩的正式通信模式,因为存在非零概率。)

我不太理解你的问题。依我看,这取决于你的需要。或者我向你们提出问题:
cm
antenna\u mon
之间的逻辑关系是什么?它们都是阻塞的还是非阻塞的?他们是否访问共享内存?无论如何,我认为你的问题不是关于ZeroMQ,而是关于你的需要。因此,分析您的需求,设计结构,然后编写代码。对我来说,如何操作多个套接字是一个关于结构的问题,而ZeroMQ是另一个关于代码的问题。@Yuhui CM是一个发布者,当配置参数发生更改时通知订阅者。因此,antenna_mon对配置更改通知感兴趣。然而,我还想询问一下他的状态,以便从他那里得到统计数据。ZeroMQ适合这份工作吗?如果是,我该怎么做?指南中的所有示例都要求每个进程只做一件事,但在现实生活中,我希望antenna_mon做多件事(成为配置更改的订阅者,同时也是查询的服务器)。您在下面的评论中回答了自己的问题。zmq_poll()正是您想要的。您还可以在轮询器中注册计时器,以便定期“唤醒”线程以进行其他工作(不是由传入消息触发)。@colini谢谢,轮询正是我想要做的。我需要更加耐心,并在指南中更进一步。我想我的问题是——在使用PUB/ROUTER/PULL的服务器的图表中——这是如何实际实现的?服务器是否有3个线程(一个用于处理PUB套接字,一个用于处理路由器,一个用于处理PULL)或者它只是在所有三个线程中使用NOBLOCK选项并在循环中检查它们?实际上,我刚刚遇到了这样一个问题:-我想我现在会尝试轮询。我想最好的下一步是阅读伟大的Pieter Hintjens的书“Code Connected:Vol.1”绝对值得你的时间,眼泪和汗水,真的。我的代码从不缺少NOBLOCK,总是将套接字映射到具有不同I/O优先级的线程上,如果进入线程,则在proc://transport类中使用零拷贝对/对或PUSH/PULL over(实际上是一个超级快速的共享内存块)可能会很有好处。当然,你会喜欢的。由于主循环时间步长预算,到目前为止,我更倾向于为每个目的配备一个专业的民意调查人员,在那里我可以保证最大往返时间和最小持续时间,