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