Ich bin mir bewusst, dass Python-Threads Bytecode nur einzeln ausführen können, warum also würde die threading-Bibliothek Sperren bereitstellen? Ich nehme an, dass Race-Bedingungen nicht auftreten können, wenn nur ein Thread gleichzeitig ausgeführt wird.Warum stellt Python Sperrmechanismen zur Verfügung, wenn es einer GIL unterliegt?
Die Bibliothek bietet Sperren, Bedingungen und Semaphore. Ist dies der einzige Zweck, um die Ausführung zu synchronisieren?
Update:
ich ein kleines Experiment durchgeführt:
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
Grundsätzlich sollte ich von 1. Das zurückgegebene Ergebnis 100k Threads und erhöht begonnen haben, war 99993.
a) Wie kann das Ergebnis 99999 nicht sein, wenn es eine GIL-Synchronisierung gibt und Rennbedingungen vermeidet? b) Ist es überhaupt möglich, 100k OS-Threads zu starten?
Update 2, nach Antworten zu sehen:
Wenn die GIL nicht wirklich bieten eine Möglichkeit, eine einfache Bedienung wie Inkrementieren atomar durchzuführen, was ist der Zweck es dort zu haben? Es hilft nicht bei bösen Nebenläufigkeitsproblemen, also warum wurde es eingesetzt? Ich habe Anwendungsfälle für C-Extensions gehört, kann jemand dies exemplarisch darstellen?
Die GIL schützt den Python-Interpreter vor Nebenläufigkeitsproblemen und nicht vor Code, den Sie schreiben. Es ist wirklich ein Implementierungsdetail von CPython, und Sie sollten sich nicht auf sein Verhalten in Ihrem eigenen Code verlassen, obwohl es wahrscheinlich nicht bald wieder verschwinden wird. – dano