Каков глобальный тайм-аут по умолчанию

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,

Если тайм-аут не указан, используется глобальная настройка таймаута по умолчанию, возвращаемая функцией: 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);
}

Ранее в том же файле,

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

Таким образом, это выглядит как Py_None, aka None, это тайм-аут по умолчанию. Другими словами, urlopen никогда не истекает. По крайней мере, не с конца Python. Я предполагаю, что тайм-аут все равно может произойти, если сетевые функции, предоставляемые ОС, имеют тайм-ауты сами.


Edit: oops, мне кажется, мне не нужно было переходить на исходный дайвинг для ответа, так как он находится прямо в docs.

Значение None указывает, что новые объекты сокета не имеют таймаута. Когда сначала импортируется модуль сокета, по умолчанию используется None.