Seite 1 von 1

Multithreading bei Multiprozessorsystemen

Verfasst: Montag 21. April 2008, 16:05
von astraios
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!

Re: Multithreading bei Multiprozessorsystemen

Verfasst: Montag 21. April 2008, 16:10
von Leonidas
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.

Verfasst: Montag 21. April 2008, 17:17
von CM
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

Re: Multithreading bei Multiprozessorsystemen

Verfasst: Montag 21. April 2008, 19:18
von gerold
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
:-)

Verfasst: Mittwoch 17. September 2008, 12:27
von jens
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

Verfasst: Mittwoch 17. September 2008, 12:50
von 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...

Verfasst: Mittwoch 17. September 2008, 12:57
von astraios
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!

Verfasst: Mittwoch 17. September 2008, 14:06
von Leonidas
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.