Sono consapevole che i thread Python possono eseguire solo bytecode uno alla volta, quindi perché la libreria threading fornisce i blocchi? Presumo che le condizioni di gara non possano verificarsi se solo un thread è in esecuzione alla volta.Perché Python fornisce meccanismi di blocco se è soggetto a un GIL?
La libreria fornisce blocchi, condizioni e semafori. L'unico scopo è sincronizzare l'esecuzione?
Aggiornamento:
ho eseguito un piccolo esperimento:
from threading import Thread
from multiprocessing import Process
num = 0
def f():
global num
num += 1
def thread(func):
# return Process(target=func)
return Thread(target=func)
if __name__ == '__main__':
t_list = []
for i in xrange(1, 100000):
t = thread(f)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print num
Fondamentalmente ho dovuto iniziare le discussioni 100k e incrementato di 1. Il risultato riscontrato è 99993.
a) Come può il risultato non essere 99999 se c'è una sincronizzazione GIL ed evitare le condizioni di gara? b) È anche possibile avviare thread 100k OS?
Update 2, dopo aver visto le risposte:
Se la GIL in realtà non fornisce un modo per eseguire una semplice operazione come incrementare atomicamente, qual è lo scopo di avere lì? Non aiuta con problemi di concorrenza brutti, quindi perché è stato messo in atto? Ho sentito casi d'uso per estensioni C, qualcuno può esemplificare questo?
Il GIL è lì per proteggere l'interprete Python stesso da problemi di concorrenza, piuttosto che il codice che scrivi. È davvero un dettaglio di implementazione di CPython e non dovresti fare affidamento sul suo comportamento nel tuo codice, anche se non è probabile che vada via in qualunque momento presto. – dano