2014-07-18 16 views
11

mi sono imbattuto in questa dichiarazione interessante nella sezione "Avvertenze" della documentazione per il modulo thread oggi:Esistono funzioni integrate che bloccano su I/O che non consentono l'esecuzione di altri thread?

Non tutte le funzioni built-in che può bloccare in attesa di I/O consentire ad altri thread di funzionare. (I più popolari (time.sleep(), file.read(), select.select()) funzionare come previsto.)

Praticamente ovunque io abbia mai visto le discussioni Python discussi, c'è sempre stato un presupposto che tutte le funzioni built-in che do I/O rilascerà il GIL, il che significa che altri thread possono essere eseguiti mentre i blocchi di funzione. Per quanto ne sapevo, l'unico rischio di un'operazione di I/O che bloccava altri thread sarebbe se fosse stato eseguito su un'estensione C buggata che trascurava di rilasciare GIL.

Quindi, questa affermazione dei documenti thread è effettivamente vera? Esistono operazioni di I/O di blocco integrate che non rilasciano GIL? Non sono stato in grado di trovare alcun esempio specifico finora.

+0

Forse è specifico per l'implementazione. Forse CPython non ha funzioni I/O che non rilascino GIL, ma altre versioni sono autorizzate ad averle, a patto che sleep/read/select rimangano rilasciati da GIL. – Kevin

+0

Sì, credo che @Kevin sia corretto. Significa solo che gli sviluppatori di estensioni non sono tenuti a rilasciare GIL, è solo una buona pratica all'interno dell'estensione per farlo. Lo sviluppatore deve sapere che la loro funzione è semplicemente in attesa di I/O e programma GIL in un modo specifico. Quindi, non è garantito. – beiller

+0

@beiller Il documento specifica in particolare "funzioni built-in", il che mi suggerisce che non è il factoring nelle estensioni C qui. – dano

risposta

10

Ecco il official word from Guido van Rossum su questo:

Non nei miei sogni più selvaggi avrei potuto aspettare che tale affermazione sarebbe ancora nella documentazione 20 anni più tardi. :-) Si prega di sbarazzarsi di esso.

Quindi la risposta alla mia domanda è "No".