Python-Threads, die alle auf einem einzelnen Kern ausgeführt werden
Habe ich ein Python-Programm, das laicht viele threads, läuft 4 zu einem Zeitpunkt, und jeder führt eine teure operation ist. Pseudocode:
for object in list:
t = Thread(target=process, args=(object))
# if fewer than 4 threads are currently running, t.start(). Otherwise, add t to queue
Aber wenn das Programm ausgeführt wird, die Aktivitätsanzeige in OS X zeigt, dass 1 von den 4 logischen Kernen auf 100% und der andere bei fast 0. Ich kann natürlich nicht zwingen das OS nichts zu tun, aber ich hatte noch nie um die Aufmerksamkeit auf die performance in multi-threaded-code, wie dies vor so dass ich Frage mich, wenn ich mich gerade fehlt oder ein Missverständnis etwas.
Dank.
InformationsquelleAutor der Frage Rob Lourens | 2010-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass in vielen Fällen (und praktisch allen Fällen, in denen Sie Ihre "teure operation" ist eine Berechnung implementiert in Python), mehrere threads nicht wirklich parallel durch Python ' s Global Interpreter Lock (GIL).
Finden Sie in der Global Interpreter Lock Abschnitt Jesse Noller ' s post für mehr details.
Zu diesem problem zu umgehen, überprüfen Sie heraus Python-multiprocessing-Modul.
-- Guido van Rossum (der Schöpfer von Python)
InformationsquelleAutor der Antwort Gabriel Grant
Python hat eine Globale Interpreter-Sperre, die verhindern, dass threads von interpretierten code wird gleichzeitig verarbeitet.
http://en.wikipedia.org/wiki/Global_Interpreter_Lock
http://wiki.python.org/moin/GlobalInterpreterLock
Für Möglichkeiten um dies zu umgehen, versuchen die multiprocessing-Modulwie empfohlen hier:
Tut separate python-Prozesse zu vermeiden, die GIL?
InformationsquelleAutor der Antwort T.R.
AFAIK in CPython die Globale Interpreter-Sperre bedeutet, dass es kann nicht mehr als einen block von Python-code ausgeführt wird. Obwohl dies nicht wirklich Einfluss auf das, was in einem single-Prozessor/single-core-Maschine, auf einem mulitcore-Maschine, es bedeutet, dass Sie effektiv nur einen thread gleichzeitig laufen lassen - so dass alle anderen Kern im Leerlauf befindet.
InformationsquelleAutor der Antwort MAK