2015-04-15 90 views
10

Python 3.4。 嘗試查找urllib.request.urlopen()中的默認超時值。什麼是全局默認超時

它的簽名是: urllib.request.urlopen(URL,數據=無,[超時,] *,憑證檔案錯誤=無,capath =無,cadefault =假,上下文=無)

doc說它的「全局默認超時時間」,並看看它的代碼: socket._GLOBAL_DEFAULT_TIMEOUT

仍然是什麼實際值以秒爲單位?

回答

13

我懷疑這是依賴於實現的。這就是說,對於CPython的:FUNC:

socket.create_connection

如果沒有超時供應,全局默認超時設置由歸國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結束。我想如果OS提供的網絡功能本身有超時,仍然會發生超時。


編輯:哎呀,我想我也沒必要去潛水源的答案可言,因爲它是在docs那裏。

None表示新的套接字對象沒有超時。首次導入套接字模塊時,默認爲None

+0

那麼......從Linux內核看起來呢? – confiq