什么是全局默认超时

Posted

技术标签:

【中文标题】什么是全局默认超时【英文标题】:What is the global default timeout 【发布时间】:2015-06-21 08:26:30 【问题描述】:

Python 3.4 。 尝试在 urllib.request.urlopen() 中查找默认超时时间。

它的签名是: urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

doc 表示其“全局默认超时”,并查看其代码: socket._GLOBAL_DEFAULT_TIMEOUT

仍然以秒为单位的实际值是多少?

【问题讨论】:

【参考方案1】:

我怀疑这是依赖于实现的。也就是说,对于 CPython:

来自socket.create_connection

如果没有提供 timeout,则使用 :func:getdefaulttimeout 返回的全局默认超时设置。

来自socketmodule.c

static PyObject *
socket_getdefaulttimeout(PyObject *self)

    if (defaulttimeout < 0.0) 
        Py_INCREF(Py_None);
        return Py_None;
    
    else
        return PyFloat_FromDouble(defaulttimeout);

Earlier 在同一个文件中,

static double defaulttimeout = -1.0; /* Default timeout for new sockets */

所以看起来Py_None,又名None,是默认超时。换句话说,urlopen 永远不会超时。至少不是从 Python 端。如果操作系统提供的网络功能本身超时,我想仍然会发生超时。


编辑:哎呀,我想我根本不需要去寻找答案,因为它就在docs 中。

None 的值表示新的套接字对象没有超时。首次导入socket模块时,默认为None

【讨论】:

所以...它看起来来自 Linux 内核? 当您使用 urllib2.urlopen(link)urllib2.urlopen(link, timeout=1) 时,这会导致一些困难的调试。很高兴我找到了这个答案。 @teewuane 不是。无论如何,您通常都会捕获 stderr 进行日志记录。如果您现在意识到您处理空闲,您可以发送一个 SIGINT 并获取最新的跟踪到您的日志:example = request.urlopen([...]) File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen [...] File "/usr/lib/python3.7/ssl.py", line 1117, in do_handshake self._sslobj.do_handshake() KeyboardInterrupt 但我不认为None 是一个合理的默认超时...

以上是关于什么是全局默认超时的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#愚公系列2022年10月 微信小程序-全局配置属性

Dubbo默认超时时间

extjs 6.53 全局增加远程请求超时

更改 mocha 的默认超时

Mybatis设置超时时间

如何使用 mstest 增加单元测试运行的全局超时