什么是全局默认超时

What is the global default timeout

Python 3.4 。 试图找到 urllib.request.urlopen() 中的默认超时是什么。

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

doc 表示它是 "global default timeout",并查看代码: socket._GLOBAL_DEFAULT_TIMEOUT

实际的秒数是多少?

我怀疑这取决于实现。也就是说,对于 CPython:

来自 socket.create_connection,

If no timeout is supplied, the global default timeout setting returned by :func:getdefaulttimeout is used.

来自 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 结束。我想如果 OS 提供的网络功能本身有超时,仍然会发生超时。


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

A value of None indicates that new socket objects have no timeout. When the socket module is first imported, the default is None.