0

我正在尝试将套接字连接到端点,直到套接字从该端点接收数据。这是因为那个时候端点可能不存在。

目前连接停止,我猜是因为它无法解析主机名,这需要一段时间。

有没有办法在套接字连接上设置超时?

import zmq
import time

endpoint = 'tcp://doesnt_exist:12345'

ctx = zmq.Context.instance()
s = ctx.socket(zmq.SUB)

t = time.time()
try:
    s.connect(endpoint)
except Exception:
    pass

print time.time() - t
4

2 回答 2

2

如果您向 提供主机名connect,ZeroMQ 通过调用 使用同步 DNS 解析getaddrinfo,这就是您看到connect调用阻塞的原因。

如果你真的需要以connect可控的方式,我建议你自己做 DNS 解析,使用 Python 已经可用的异步 DNS 解析器之一(检查这个基于 pyuc/pycares 的例子)。

另请参阅我对类似问题的回复。

于 2014-01-16T20:25:02.890 回答
1

问题不在于连接,而在于 DNS 查找。阻塞是在gethostbyname调用时在操作系统级别完成的。

由于超时由操作系统控制,因此很难解决(但可行)。我的建议是您只需对 IP 进行硬编码

于 2014-01-16T20:15:33.843 回答