如果连接端点是tcp://192.168.0.2:9876之类的IP,则Socket.connect将立即返回。但是,如果端点包含DNS名称,例如tcp://server.local。:9876,则Socket.connect似乎会阻塞,直到server.local。解析,最终失败,如果名称无法解析,则会引发zmq.error.ZMQError异常。
有没有一种以非阻塞方式连接的方法?
最佳答案
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,看起来非常漂亮。