如果连接端点是类似tcp://192.168.0.2:9876的IP,则Socket.connect将立即返回。但是,如果端点包含DNS名称,如tcp://server.local。:9876 Socket.connect似乎阻塞,直到server.local。已解决,并最终失败,并在无法解析名称时引发zmq.error.ZMQError异常。
有没有办法以非阻塞方式连接?
答案 0 :(得分:3)
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,看起来很不错。