【问题标题】:ZeroMQ connect is blockingZeroMQ 连接阻塞
【发布时间】:2014-01-17 04:19:04
【问题描述】:

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

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

【问题讨论】:

  • 这个问题和this one一模一样,两小时前发帖

标签: python sockets networking tcp zeromq


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2018-09-20
    • 2017-04-18
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多