threading erscheint zum ausführen von threads nacheinander
Ich versuche, mit threads in ein Python-Projekt, das ich arbeite, aber threads nicht angezeigt werden, Verhalten sich wie Sie sollen in meinem code. Es scheint, dass alle threads nacheinander ausgeführt werden (d.h. Thread2 verzahnt beginnt, nachdem thread 1 beendet hat, wird Sie nicht beide zur gleichen Zeit starten). Ich schrieb ein einfaches Skript, um dies zu testen, und das auch noch läuft threads nacheinander.
import threading
def something():
for i in xrange(10):
print "Hello"
def my_thing():
for i in xrange(10):
print "world"
threading.Thread(target=something).start()
threading.Thread(target=my_thing).start()
Hier ist die Ausgabe, die ich von ausgeführt es:
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
world
world
world
world
world
world
world
world
world
world
Das gleiche Verhalten beobachtet wird, mit viel größeren Anzahl der Iterationen der Schleifen.
Ich habe versucht, die Suche im web und ältere SO Antworten, aber ich konnte nichts finden, dass hat geholfen.
Kann mir bitte jemand erklären, was ist falsch an diesem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit in python, threads geändert, nachdem Sie ein paar bestimmte Menge von bytecode-Instruktionen. Sie laufen nicht gleichzeitig. Sie haben nur threads in parallel, wenn man von Ihnen fordert, einige I/O-intensiv oder nicht-python-beeinflussen-Modul release-GIL (global interpreter lock).
Ich bin mir ziemlich sicher, Sie werden die Ausgabe gemischt werden, wenn Sie die bump-die Anzahl der Schleifen zu so etwas wie 10000. Denken Sie daran, dass Sie einfach das laichen der zweite thread nimmt auch "viel" Zeit.
./pythr.py | uniq -c
ich bekommen: 8969 Hallo | 1 Hallo-Welt | 6626 Welt | 1 | 3373 Welt | 1030 Hallo. So ist es nicht ändern Sie die Steuerelement - nur nicht so oft...multiprocessing
instread vonthreading
Modul. So dass der code tatsächlich parallel ausgeführt wird.In der Zeit, die es dauert, den zweiten thread zu starten, der erste thread, Schleifen und prints schon.
Hier sieht es aus wie diese, können Sie sehen, der 2. thread starten, nachdem die ersten ausgestrahlten ein paar hellos.
Btw: Dein Beispiel ist nicht aussagekräftig überhaupt. Der einzige Grund für Threads ist IO und IO ist langsam. Wenn Sie hinzufügen, einige schlafen zu simulieren IO es sollte funktionieren wie erwartet:
einem wilden mix erscheint:
Das Verhalten kann sich auch ändern, je nachdem, ob das system über einen einzigen Prozessor oder mehrere Prozessoren, wie erläutert durch dieser Vortrag von David Beazley.
Als viraptor sagt, der erste thread-Freisetzung, die GIL nach dem ausführen von sys.getcheckinterval() Bytecode (100 standardmäßig). Zu crudly zusammenfassen, was David Beazley sagt, auf einem einzelnen Prozessor-system der zweite thread wird dann eine chance haben, zu übernehmen. Allerdings auf einem multi-core-system der zweite thread ausgeführt werden, kann auf einem anderen Kern, und der erste thread wird versuchen, erneut den lock, und werden wahrscheinlich erfolgreich sein, da das OS wird nicht Zeit gehabt haben zu wechseln-Prozessoren. Dies bedeutet, dass auf einem multi-core-system mit einem CPU-bound-thread, die anderen threads kann nie get a look-in.
Den Weg, um dieses ist, um eine sleep-Anweisung, um die beiden Schleifen, so dass Sie nicht mehr CPU-gebunden.
Dies hängt wirklich davon ab, Ihr Betriebssystem scheduler, ist Ihr Prozessor.
Other than, die es ist bekannt, dass CPython-threads sind nicht perfekt, weil die GIL(PDF), die, kurz gesagt, bedeutet, dass oft threads tun, die sequenziell ausgeführt werden, oder so etwas in der Art.