ZeroMQ连接正在阻塞

时间:2014-01-16 19:55:59

标签: python sockets networking tcp zeromq

如果连接端点是类似tcp://192.168.0.2:9876的IP,则Socket.connect将立即返回。但是,如果端点包含DNS名称,如tcp://server.local。:9876 Socket.connect似乎阻塞,直到server.local。已解决,并最终失败,并在无法解析名称时引发zmq.error.ZMQError异常。

有没有办法以非阻塞方式连接?

1 个答案:

答案 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,看起来很不错。