【问题标题】:ZeroMQ connect is blockingZeroMQ 连接阻塞
【发布时间】:2014-01-17 04:19:04
【问题描述】:
如果连接端点是像 tcp://192.168.0.2:9876 这样的 IP,Socket.connect 将立即返回。但是,如果端点包含像 tcp://server.local.:9876 这样的 DNS 名称,则 Socket.connect 似乎会阻塞,直到 server.local。已解决,如果名称无法解析,最终会失败并引发 zmq.error.ZMQError 异常。
有没有办法以非阻塞方式连接?
【问题讨论】:
标签:
python
sockets
networking
tcp
zeromq
【解决方案1】:
DNS 主机名解析在zmq::socket_base_t::connect 内以同步方式完成:
// Resolve address (if needed by the protocol)
if (protocol == "tcp") {
paddr->resolved.tcp_addr = new (std::nothrow) tcp_address_t ();
alloc_assert (paddr->resolved.tcp_addr);
int rc = paddr->resolved.tcp_addr->resolve (
address.c_str (), false, options.ipv6);
if (rc != 0) {
delete paddr;
return -1;
}
}
因此,您似乎别无选择,只能自己进行异步 DNS 解析,然后将解析后的地址传递给 ZeroMQ。
您可能会发现以下resolver example 很有用。它基于 pyuv/pycares,看起来很不错。