2015-04-15 22 views
10

Python 3.4. Cercando di trovare qual è il timeout predefinito in urllib.request.urlopen().Qual è il timeout predefinito globale

la sua firma è: urllib.request.urlopen (url, data = None, [timeout,] *, CAFile = Nessuno, capath = Nessuno, cadefault = False, context = None)

Il doc dice che è il suo "timeout globale predefinito" e guardando il codice: socket._GLOBAL_DEFAULT_TIMEOUT

Ancora qual è il valore effettivo in secondi?

risposta

13

Sospetto che dipenda dall'implementazione. Detto questo, per CPython:

Da socket.create_connection,

Se non timeout viene fornito, il timeout predefinito Impostazione globale restituito dal: func: getdefaulttimeout viene utilizzato.

Da 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 nello stesso file,

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

modo che appaia come Py_None, alias None, è il timeout predefinito. In altre parole, urlopen non va mai scaduto. Almeno non dalla fine di Python. Immagino che un timeout possa ancora verificarsi se le funzioni di rete fornite dal sistema operativo hanno un timeout.


Edit: Oops, credo che non ho bisogno di fare immersioni sorgente per la risposta a tutti, dal momento che è proprio lì nel docs.

Un valore di None indica che i nuovi oggetti socket non hanno timeout. Quando il modulo socket viene importato per la prima volta, il valore predefinito è None.

+0

quindi ... sembra dal kernel di Linux? – confiq