我怀疑这取决于实现。也就是说,对于 CPython:
From socket.create_connection https://github.com/python-git/python/blob/master/Lib/socket.py#L485,
If no timeout提供了 :func 返回的全局默认超时设置:getdefaulttimeout
用来。
From socketmodule.c https://github.com/python-git/python/blob/715a6e5035bb21ac49382772076ec4c630d6e960/Modules/socketmodule.c#L4154,
static PyObject *
socket_getdefaulttimeout(PyObject *self)
{
if (defaulttimeout < 0.0) {
Py_INCREF(Py_None);
return Py_None;
}
else
return PyFloat_FromDouble(defaulttimeout);
}
Earlier https://github.com/python-git/python/blob/715a6e5035bb21ac49382772076ec4c630d6e960/Modules/socketmodule.c#L719在同一个文件中,
static double defaulttimeout = -1.0; /* Default timeout for new sockets */
所以看起来像Py_None
, aka None
,是默认超时。换句话说,urlopen
永远不会超时。至少Python端不是这样。我想如果操作系统提供的网络功能本身有超时,超时仍然可能发生。
编辑:哎呀,我想我根本不需要去寻找答案,因为它就在那里docs https://docs.python.org/3/library/socket.html?highlight=socket#socket.getdefaulttimeout.
值为None
表示新的套接字对象没有超时。第一次导入socket模块时,默认为None
.