【发布时间】:2011-11-30 22:06:43
【问题描述】:
我在中型网络上使用 ZMQ 2.1 进行了简单的发布-订阅设置。虽然一些订阅者使用 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)
此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。
我尝试过非阻塞版本和轮询版本,但无论哪种情况,这种即时终止问题都仍然存在。有什么明显的事情我应该做,但我没有? (也就是说,对其他人来说很明显:))。
编辑:
找到以下内容:https://zeromq.jira.com/browse/LIBZMQ-207
似乎这是/曾经是一个已知问题。
该链接进一步链接到 Github,其中 2.1.10 的更改日志有以下注释:
- 修复了问题 207,zmq_connecter.cpp:48 中的断言失败,当 使用了无效的 zmq_connect() 字符串,或者无法使用主机名 解决。 zmq_connect() 调用现在在这两种情况下都返回 -1。
虽然 connect() 确实在 Python 中引发了 Invalid Argument 异常(显然不是 C#?),但 recv() 仍然失败。如果订户机器突然失去网络,该订户将停止运行。
所以 - 我将尝试使用 IP 地址而不是命名地址,看看这是否会绕过这个问题。不理想,但比 insta-crash 好。
【问题讨论】:
标签: c# python publish-subscribe zeromq