web-dev-qa-db-ja.com

グローバルデフォルトタイムアウトとは

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

それでも秒単位の実際の値は何ですか?

24
user3139774

これは実装に依存すると思われます。つまり、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);
}

以前 同じファイル内、

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

したがって、Py_None、別名Noneはデフォルトのタイムアウトです。つまり、urlopenはタイムアウトしません。少なくともPython end。からではありません。OSが提供するネットワーク機能自体にタイムアウトがあると、タイムアウトが発生する可能性があります。


編集:おっと、私はそれが docs の中にあるので、答えのためにソースダイビングに行く必要はなかったと思います。

Noneの値は、新しいソケットオブジェクトにタイムアウトがないことを示します。ソケットモジュールが最初にインポートされるとき、デフォルトはNoneです。

26
Kevin