我正在尝试将套接字连接到端点,直到套接字从该端点接收数据。这是因为当时端点可能不存在。
目前连接失速,我猜是因为它无法解析主机名而需要一段时间。
有没有办法在套接字连接上设置超时?
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
答案 0 :(得分:2)
如果您为connect
提供主机名,则ZeroMQ会通过拨打getaddrinfo
来使用同步DNS解析,这就是您看到connect
来电阻止的原因。
如果您确实需要以可控方式connect
,我建议您使用已经可用于Python的异步DNS解析器之一自行进行DNS解析(检查this example based on pyuc/pycares)。
另见我对similar question的回复。
答案 1 :(得分:1)
问题不是连接,而是DNS查找。阻止是在操作系统级别gethostbyname
呼叫上完成的。
由于超时由操作系统控制,因此可以解决它is hard(但可行)。我的建议是你只需硬编码IP