Seite 1 von 1
Multithreading Problem
Verfasst: Mittwoch 11. November 2009, 18:40
von Bob13
Liebe Community!
Ich habe einen (sehr) billigen Primzahlfinder geschrieben, der Multithreading unterstützt. Nun steh ich vor dem Problem, dass der Python meinen PC (AMD 2 Kern Prozessor, Win XP) nur 50% auf jedem Kern auslastet. Bitte um eine Lösung des Problems!
Gruß Bob13!
Verfasst: Mittwoch 11. November 2009, 18:43
von ms4py
Ein Pythonprozess kann nur einen Kern nutzen, und ist damit auch langsamer bei MultiThreading...
Verfasst: Mittwoch 11. November 2009, 18:46
von Bob13
warum nutzt python dann auf jedem kern genau 50% aus und nicht auf einem 100% (scheduler?)?
Verfasst: Mittwoch 11. November 2009, 18:46
von gerold
Hallo!
Vielleicht bringt es was, statt Multithreading, Multiprocessing einzusetzen.
http://docs.python.org/library/multiprocessing.html
Ohne Gewähr -- ich habe es noch nie ausprobiert.
mfg
Gerold

Verfasst: Mittwoch 11. November 2009, 18:48
von Bob13
hey Danke!
Werds sofort ausprobieren

Verfasst: Mittwoch 11. November 2009, 18:59
von ms4py
Bob13 hat geschrieben:warum nutzt python dann auf jedem kern genau 50% aus und nicht auf einem 100% (scheduler?)?
Sry, war nicht ganz richtig erklärt. Hier stehts genauer:
http://www.grouplens.org/node/244
Es gibt außerdem noch eine Menge externer Module, z.B. Parallel Python, die bei dem Problem ansetzen. Hab aber noch nichts davon getestet. Würde gerne einen Erfahrungsbericht von dir hören.
Verfasst: Mittwoch 11. November 2009, 19:27
von gerold
gerold hat geschrieben:Ohne Gewähr -- ich habe es noch nie ausprobiert.
OK, jetzt habe ich es mal ausprobiert. Das zieht ja ab, wie Nachbars Katze.
Hier mein Testcode (bitte zwingt mich nicht dazu, den Testcode aufzuräumen):
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
from multiprocessing import Process
from threading import Thread
class RunnerT(Thread):
def run(self):
for i in xrange(10000000):
if i % 10000 == 0:
print i
class RunnerP(Process):
def run(self):
for i in xrange(10000000):
if i % 10000 == 0:
print i
def main_threads():
threads = []
for i in xrange(2):
threads.append(RunnerT())
threads[-1].start()
for thread in threads:
thread.join()
def main_processes():
processes = []
for i in xrange(2):
processes.append(RunnerP())
processes[-1].start()
for process in processes:
process.join()
if __name__ == "__main__":
main_threads()
main_processes()
Ich habe einen Pentium D 3,4 GHz mit Windows XP 32 Bit. Das ist also noch ein älterer Zweikerner. Aber der zweite Teil des Testes läuft (ungemessen) mehr als doppelt so schnell durch.
Bei ersten Teil ist der Prozessor zu 50 % ausgelastet. Beim zweiten Teil des Testes bis zu 100 %.
lg
Gerold

Verfasst: Mittwoch 11. November 2009, 19:37
von ms4py
Also bei mir läuft der 2te Teil mind. 5mal so schnell ab.
Bin echt überrascht, das muss ich mir merken...
Mein System:
Win 7 64bit
Py 2.6
Intel Core Duo P8600 2.4GHz
4 GB RAM
Verfasst: Mittwoch 11. November 2009, 19:44
von gerold
Hallo!
Ich habe jetzt meinen Testcode um eine Geschwindigkeitsmessung erweitert.
http://paste.pocoo.org/show/150031/
Wenn man zwei Threads mit zwei Prozessen vergleicht, dann schneiden die Threads sehr viel schlechter ab.
Threads: 71.54
Processes: 16.88
Vergleicht man aber einen Thread mit zwei Prozessen, dann sieht die Sache gleich ganz anders aus.
Threads: 15.86
Processes: 16.60
Es fühlte sich zwar schneller an, aber der Vorteil ist nicht gegeben. Ich denke aber, dass man hier einen Vierkern-Prozessor richtig gut spüren kann.
mfg
Gerold
PS: Ich werde den Test in ein paar Wochen mit meinem neuen Intel Core i7-950 wiederholen.

Verfasst: Mittwoch 11. November 2009, 21:15
von Dav1d
Meine Ausgabe
Threads: 7.1400001049
Processes: 7.6099998951
Python 2.6.2
Q9550 4x 2.83GHZ
4GB Ram, WinXP32
Verfasst: Mittwoch 11. November 2009, 22:12
von gerold
Dav1d hat geschrieben:Meine Ausgabe
Threads: 7.1400001049
Processes: 7.6099998951
Python 2.6.2
Q9550 4x 2.83GHZ
4GB Ram, WinXP32
Hallo Dav1d!
Drehe doch mal die Prozesse hoch. Statt nur zwei Prozesse auf vier. Was kommt dann raus?
Ach ich Trottel!!!
Das Testprogramm ist Schrott! Ich verändere mit der Anzahl an Prozessen die zu verrichtende Arbeitsmenge. Sorry! Aber ein neues Testprogramm muss warten. Dafür habe ich jetzt keine Zeit mehr.
mfg
Gerold

Verfasst: Donnerstag 12. November 2009, 08:52
von CM
gerold hat geschrieben:Es fühlte sich zwar schneller an, aber der Vorteil ist nicht gegeben. Ich denke aber, dass man hier einen Vierkern-Prozessor richtig gut spüren kann.
Kann man.

Insbesondere liebe ich multiprocessing.Pool. Das kann man zwar nicht ohne Weiteres innerhalb von Klassen einsetzen (weil deren Methoden nicht pickable sind), vereinfacht aber ansonsten das Leben ... ui! (Dummerweise habe ich gerade keine Zeit für Beispiele.)
Gruß,
Christian
Verfasst: Donnerstag 12. November 2009, 12:50
von Bastl
Über dieses Video bin ich gerade gestolpert vielleicht interessiert es jemanden.
http://us.pycon.org/2009/conference/schedule/event/31/
Verfasst: Donnerstag 12. November 2009, 13:38
von Dav1d
gerold mach ich gerne, es lief nebenbei noch die Vmware mit 2 Betriebssystemen, also da ist noch was drin
