Multithreading bei Multiprozessorsystemen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
astraios
User
Beiträge: 9
Registriert: Montag 21. April 2008, 15:45

Hallo Forum!

Beim Durcharbeiten eines Python-Lern-Buches bin ich beim Thema Multithreading angekommen und musste eine erschreckende Feststellung machen: Kann es sein, dass Python nicht auf mehreren Prozessorkernen arbeiten kann?

Ich habe das Testprogramm aus dem Buch:

Code: Alles auswählen

import threading 
 
class PrimzahlThread(threading.Thread): 
    def __init__(self, zahl): 
        threading.Thread.__init__(self) 
        self.Zahl = zahl 
 
    def run(self): 
        i = 2 
        while i*i < self.Zahl: 
            if self.Zahl % i == 0: 
                print "%d ist nicht prim, da %d = %d * %d" % ( 
                    self.Zahl, self.Zahl, i, self.Zahl / i) 
                return 
            i += 1 
        print "%d ist prim" % self.Zahl 
 
meine_threads = [] 
 
while 1: 
    eingabe = raw_input("> ") 
    if eingabe == "ende": 
        break 
 
    thread = PrimzahlThread(long(eingabe)) 
    meine_threads.append(thread) 
    thread.start() 
 
for t in meine_threads: 
    t.join()

Dabei kann man Zahlen eingeben und es wird parallel geprüft, obs eine Primzahl ist.
Das ganze läuft auf einem Dualcore Prozessor unter WinXP Pro.
Gebe ich nun zwei große Zahlen ein (z.B. 2x 4503599627370449), dann würde ich auf beiden Kernen 100% Auslastung erwarten. Dem ist aber nicht so: Ich habe auf beiden Kernen nur ca. 50%!

Also meine Frage: Kann das Python 2.5 nicht? Wie sieht's mit Python 3.0 aus? Wird es da gehen?

Vielen Dank für Eure Antworten!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo astraios, willkommen im Forum,
astraios hat geschrieben:Also meine Frage: Kann das Python 2.5 nicht? Wie sieht's mit Python 3.0 aus? Wird es da gehen?
Nein und nein. Der CPython-Interpreter hat einen GIL (Global Interpreter Lock), der verhindert, dass Python-Code parallel läuft. Was aber funktioniert ist, dass C-Module parallel zu Python-Code laufen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was Du aber ggf. nutzen kannst ist numpy. Hierbei wird der GIL manchmal freigegeben:
http://www.scipy.org/Cookbook/Multithreading (siehe vor allem Dingen auch die beiden angehangen Files)
Und mehr Info findet sich hier: http://www.scipy.org/ParallelProgramming , inkl. einiger Links auf dem Ende der Seite.
Aber parallel Rechnen ist ohnehin nicht so einfach ...

HTH
Christian
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

astraios hat geschrieben:Kann das Python 2.5 nicht?
Hallo astraios!

Willkommen im Python-Forum!

Vielleicht findest du im Cheeseshop ein paar Anregungen:
http://pypi.python.org/pypi?%3Aaction=s ... mit=search

Außerdem hindert dich niemand daran, mehrere Python-Prozesse gleichzeitig laufen zu lassen. Sich damit zu beschäftigen, rentiert sich aber erst, wenn du es brauchst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab zum Thema was bei wikipedia gelesen, http://de.wikipedia.org/wiki/Python_(Pr ... he)#Kritik :
Auf Multiprozessor-Systemen behindert der sogenannte Global Interpreter Lock (GIL) von CPython die Effizienz von Python-Anwendungen, die Multithreading benutzen.[9] (Diese Beschränkung existiert unter Jython oder IronPython nicht.) Es ist nicht geplant, den GIL zu ersetzen. Stattdessen wird empfohlen, statt Threads mehrere miteinander kommunizierende Prozesse zu verwenden.[10][11]
Als Links sind angegeben:
10 http://www.python.org/doc/faq/library/# ... reter-lock
11 http://www.artima.com/weblogs/viewpost. ... ead=214235

Ich frage mich allerdings, warum Jython und IronPython nicht die Probleme haben. Gibt es da kein GIL?

EDIT: Doofes phpBB

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ich würde das `processing`-Modul ( http://developer.berlios.de/projects/pyprocessing ) empfehlen, weil das ab Python 2.6 unter dem Namen `multiprocessing` in der Standardbibliothek enthalten ist und die API an die `threading`-API angelehnt ist.

@astraios: Eine Klasse ist ein bisschen Overkill in diesem Fall. Da hätte es eine Funktion auch getan.

EDIT (jens): Link als Link...
astraios
User
Beiträge: 9
Registriert: Montag 21. April 2008, 15:45

Hm. Ja für dieses Beispiel ist ne Klasse ein bisschen viel. Hab das Beispiel aber auch aus nem Python-Buch. Meine spezielle Anwendung ist dann schon um einiges komplexer. Und dabei hab ich mich jetzt erstmal auf Multithreading auf einem Kern beschränkt. Aber vielleicht schau ich mir die Multiprocessing Sachen bei Gelegenheit auch mal an.

Vielen Dank für all die Antworten!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Ich frage mich allerdings, warum Jython und IronPython nicht die Probleme haben. Gibt es da kein GIL?
Jython hat keines, und bei IronPython weiß ich es nicht, aber da hieß es dass sie sich nicht entschieden haben wie das werden soll, von dem her habe ich dafür keine definitive Aussage.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten