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!
Multithreading Problem
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
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
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
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Sry, war nicht ganz richtig erklärt. Hier stehts genauer:Bob13 hat geschrieben:warum nutzt python dann auf jedem kern genau 50% aus und nicht auf einem 100% (scheduler?)?
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
OK, jetzt habe ich es mal ausprobiert. Das zieht ja ab, wie Nachbars Katze.gerold hat geschrieben:Ohne Gewähr -- ich habe es noch nie ausprobiert.
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()
Bei ersten Teil ist der Prozessor zu 50 % ausgelastet. Beim zweiten Teil des Testes bis zu 100 %.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
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.
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.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Meine Ausgabe
Threads: 7.1400001049
Processes: 7.6099998951
Python 2.6.2
Q9550 4x 2.83GHZ
4GB Ram, WinXP32
Threads: 7.1400001049
Processes: 7.6099998951
Python 2.6.2
Q9550 4x 2.83GHZ
4GB Ram, WinXP32
the more they change the more they stay the same
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Dav1d!Dav1d hat geschrieben:Meine Ausgabe
Threads: 7.1400001049
Processes: 7.6099998951
Python 2.6.2
Q9550 4x 2.83GHZ
4GB Ram, WinXP32
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
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.)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.
Gruß,
Christian
Über dieses Video bin ich gerade gestolpert vielleicht interessiert es jemanden.
http://us.pycon.org/2009/conference/schedule/event/31/
http://us.pycon.org/2009/conference/schedule/event/31/
gerold mach ich gerne, es lief nebenbei noch die Vmware mit 2 Betriebssystemen, also da ist noch was drin
the more they change the more they stay the same