如果连接端点是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,看起来非常漂亮。

10-06 14:55