丢失网络连接时ZMQ Pub-Sub程序失败

时间:2011-11-30 22:06:43

标签: c# python publish-subscribe zeromq

我在中型网络上使用ZMQ 2.1进行简单的pub-sub设置。虽然有些订阅者正在使用C#绑定,但其他订阅者正在使用Python绑定,而我遇到的问题也是如此。

如果我从运行订户的计算机上拔下网络电缆,我会收到一个无法捕获的错误,会立即终止该订户。

以下是Python中订阅者的一个非常简单的示例(不是实际的生产代码,但足以重现问题):

import zmq

def main(server_address, port):

    context = zmq.Context()
    sub_socket = context.socket(zmq.SUB)
    sub_socket.connect("tcp://" + server_address + ":" + str(port))
    sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2")

    while True:

        msg = sub_socket.recv()      
        print msg  

if __name__ == "__main__": main("company-intranet", 4000)

在C#中,程序只是默默地终止。在Python中我至少得到这个:

  

断言失败:rc == 0(.... \ src \ zmq_connector.cpp:48)

     

此应用程序已请求Runtime以不寻常的方式终止它。   请联系应用程序的支持团队以获取更多信息。

我尝试过非阻塞版本和轮询版本,但在任何一种情况下,此即时终止问题仍然存在。有什么明显的东西我应该做什么,但我不是吗? (这对其他人来说很明显:))。

修改

找到以下内容:https://zeromq.jira.com/browse/LIBZMQ-207

好像是/已知问题。

该链接进一步链接到Github,其中2.1.10的更改日志有此注释:

  
      
  • 修正了问题207,zmq_connecter.cpp中的断言失败:48,当a时   使用了无效的zmq_connect()字符串,或者主机名不能使用   解决。在这两种情况下,zmq_connect()调用现在返回-1。
  •   

虽然 connect()确实在Python中抛出了无效参数异常(显然不是C#?),但 recv()仍然失败。如果订户计算机突然丢失网络,则该订户将停止运行。

所以 - 我将尝试使用IP地址而不是命名地址,看看是否会绕过这个问题。不理想,但比insta-crash更好。

1 个答案:

答案 0 :(得分:1)

原始问题:我应该做些什么,但我不是吗?

没有

现在的解决方法是使用IP寻址。对于ZMQ 2.1.x,这不会导致网络断开时程序失败。