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.
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
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
@beiller Il documento specifica in particolare "funzioni built-in", il che mi suggerisce che non è il factoring nelle estensioni C qui. – dano