2015-04-15 6 views
10

Python 3.4. In urllib.request.urlopen() versuchen, das Standard-Timeout zu finden.Was ist das globale Standard-Timeout

Seine Unterschrift ist: urllib.request.urlopen (url, data = None, [Timeout] *, CaFile = None, capath = None, cadefault = False, context = None)

Die doc sagt dass sein "global default timeout", und schauen Sie sich den Code an: socket._GLOBAL_DEFAULT_TIMEOUT

Noch was ist der tatsächliche Wert in Sekunden?

Antwort

13

Ich vermute, das ist implementierungsabhängig. Das heißt, für CPython: func:

Von socket.create_connection,

Wenn keine Timeout zugeführt wird, das globale Standard-Timeout von zurück Einstellung getdefaulttimeout verwendet wird.

Von 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 in der gleichen Datei,

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

So sieht es aus wie Py_None, aka None, ist das Standard-Timeout. Mit anderen Worten, urlopen nie Zeitüberschreitung. Zumindest nicht von Python aus. Ich denke, ein Timeout kann immer noch auftreten, wenn die Netzwerkfunktionen des Betriebssystems selbst Timeouts haben.


Edit: oops, ich denke, ich nicht Quelle Tauchen für die Antwort überhaupt gehen musste, da es in der docs Recht gibt.

Ein Wert von None zeigt an, dass neue Socket-Objekte keine Zeitüberschreitung aufweisen. Wenn das Socket-Modul zum ersten Mal importiert wird, lautet der Standardwert None.

+0

so ... es sieht aus Linux-Kernel? – confiq