ZMQ 套接字连接超时
Posted
技术标签:
【中文标题】ZMQ 套接字连接超时【英文标题】:ZMQ socket connect timeout 【发布时间】:2014-01-16 17:42:28 【问题描述】:我正在尝试将套接字连接到端点,直到套接字从该端点接收数据。这是因为那个时候端点可能不存在。
目前连接停止,我猜是因为它无法解析主机名,这需要一段时间。
有没有办法在套接字连接上设置超时?
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
【问题讨论】:
请显示您的代码的相关部分。当你中断代码时,堆栈跟踪是什么?正如您所提到的,如果您使用主机名,您可以在程序之外(例如在控制台中)解析主机名吗? 【参考方案1】:如果您向connect
提供主机名,ZeroMQ 通过调用getaddrinfo
使用同步DNS 解析,这就是您看到connect
调用阻塞的原因。
如果您确实需要以可控方式 connect
,我建议您使用 Python 已经可用的异步 DNS 解析器之一自行进行 DNS 解析(检查 this example based on pyuc/pycares)。
另见我对similar question的回复。
【讨论】:
【参考方案2】:问题不在于连接,而在于 DNS 查找。阻塞是在操作系统级别的gethostbyname
调用上完成的。
由于超时是由操作系统控制的,所以解决它is hard(但可行)。我的建议是您只需对 IP 进行硬编码
【讨论】:
以上是关于ZMQ 套接字连接超时的主要内容,如果未能解决你的问题,请参考以下文章