1
如果连接端点是类似tcp://192.168.0.2:9876的IP,则Socket.connect将立即返回。但是,如果端点包含一个DNS名称,如tcp://server.local。:9876,则Socket.connect似乎会阻塞到server.local。已解析,并最终失败并在名称无法解析时引发zmq.error.ZMQError异常。ZeroMQ连接阻塞
有没有办法以非阻塞的方式连接?
如果连接端点是类似tcp://192.168.0.2:9876的IP,则Socket.connect将立即返回。但是,如果端点包含一个DNS名称,如tcp://server.local。:9876,则Socket.connect似乎会阻塞到server.local。已解析,并最终失败并在名称无法解析时引发zmq.error.ZMQError异常。ZeroMQ连接阻塞
有没有办法以非阻塞的方式连接?
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,看起来相当不错。
这与[this one](http://stackoverflow.com/questions/21169031)的问题完全相同,两个小时前发布 – goncalopp