Multithreading Problem

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
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

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!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ein Pythonprozess kann nur einen Kern nutzen, und ist damit auch langsamer bei MultiThreading...
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

warum nutzt python dann auf jedem kern genau 50% aus und nicht auf einem 100% (scheduler?)?
Benutzeravatar
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

hey Danke!
Werds sofort ausprobieren ;)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
Benutzeravatar
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. :-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Meine Ausgabe ;)

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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!!! :oops:

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Bastl
User
Beiträge: 9
Registriert: Montag 13. November 2006, 11:52

Über dieses Video bin ich gerade gestolpert vielleicht interessiert es jemanden.

http://us.pycon.org/2009/conference/schedule/event/31/
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
Antworten