什么是全局默认超时

时间:2015-04-15 11:36:27

标签: python request timeout urllib

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 个答案:

答案 0 :(得分:23)

我怀疑这是依赖于实现的。那说,对于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表示新套接字对象没有超时。首次导入套接字模块时,默认值为None