【问题标题】:How to exit endless zmq_poll when host ip address changes?主机IP地址更改时如何退出无尽的zmq_poll?
【发布时间】:2021-01-23 20:08:28
【问题描述】:

我用zmq_poll() 编写了一个zmq 代理,它有3 个前端和3 个后端,超时时间为-1,这使得它无穷无尽。前端套接字使用面向连接的tcp://-transport-class,并且zmq_bind() 与主机IP 地址上的tcp-端口相关联,例如tcp://192.168.1.1:1000

当我的主机 IP 地址发生变化时,有什么办法可以打破无休止的zmq_poll( ..., ..., -1 ) 循环?

while(1) {
    zmq_msg_t message;
    zmq_pollitem_t items [] = {
            { frontend1, 0, ZMQ_POLLIN, 0 },
            { backend1,  0, ZMQ_POLLIN, 0 },
    };
    zmq_poll (items, 2, -1);
    if(items[0].revents & ZMQ_POLLIN) {
     ...
    }
    if(items[1].revents & ZMQ_POLLIN) {
     ...
    }
}

我尝试轮询 ZMQ_POLLIN | ZMQ_POLLERR 之类的事件,但是当我手动更改主机的 IP 地址时,它不会从对 zmq_poll( ..., ..., -1 ) 的调用中返回。

【问题讨论】:

  • 当 IP 地址发生变化时,需要向您的程序发送信号。然后信号导致 zmq_poll 返回 EINTR 错误。信号处理程序可能应该引发一些标志,并且在你的主循环中,你应该检查这个标志。

标签: linux zeromq polling distributed-system czmq


【解决方案1】:

Q“当主机IP地址改变时如何退出无限zmq_poll?”

最好的方法是永远不要承认一段让您失去对工作流程的控制的代码。

TL;DR;

接受一个代码,你会意识到自己变得无能为力并最终依赖于一些(可能永远不会到来的)外部刺激,好吧,一个人不必是阿波罗导航计算机的设计师,但你永远不敢把这样的代码放进去生产。愿意学习关键系统设计课程吗?随意阅读来自美国宇航局阿波罗计划英雄Ms. Margaret HAMILTON 的任何内容,他拯救了机组人员免于坠入月球表面。这位聪明而勇敢的女士在 60 年前就已经对她进行了精湛的表演,终生的教训。


最好的办法:

为自我适应的机会而设计(考虑到达尔文)。

声明zmq_poll() 的所有用例在空闲周期(没有事件被标记的情况下)有一些与稳定性相关的控制循环延迟,比如100 ms 大约有一个~ 10 Hz10 ms为您已知的控制回路稳定性阈值设置一个~ 100 Hz 频闪灯,并使用您的空闲循环时间来检测和软信号通知您的代码中的任何和所有此类重要更改,从而有机会有意识地自我适应每个事件。

自适应更改的接口地址(实时系统手动 IP 地址更改就是这样)作为良好设计实践的一个例子,也应该取消所有迄今为止活跃的(现在已死)@987654328 @-s,否则这些可能会干预一些基于循环和公平队列的 Socket()-instances 方法,现在可能会无限等待,充耳不闻等)

这样的对策在这里将不胜枚举,但设计非阻塞、自适应代码的理念是相同的。

假设问题一定会出现,我们唯一不知道的是,它们何时出现、来自哪个方向以及我们必须费心处理它们的频率。

剩下的就是你的了 :o)

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多