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 套接字连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何配置套接字连接超时

如何配置套接字连接超时

android 套接字连接超时

C: 套接字连接超时

增加 TCP 套接字超时与手动重试套接字连接之间有区别吗?

heroku 中的 Django Redis 连接错误:写入套接字时出现错误 110。连接超时