Seite 2 von 2
Verfasst: Freitag 2. April 2010, 16:14
von BlackJack
@Dav1d: So richtig oder falsch wie man mit einer geratenen Zahl halt liegen kann.
Verfasst: Freitag 2. April 2010, 16:14
von lunar
@Dav1d: Oh, ich bezweifele, dass hier jemand diese Aussage bestätigen könnte ... solche Zahlen sind eigentlich nie korrekt, und ohne halbwegs vernünftige Quelle sollte man damit nicht um sich verwerfen.
Verfasst: Freitag 2. April 2010, 21:17
von philistion
Sehr schwierig, Aussagen über eine Verteilung von Performancevorteilen treffen. Das halte ich für grobe Selbstüberschätzung.
Ich finde was das angeht sowieso nur
Vergleiche an sich
Da müsste mal jemand eine Metastudie machen
Aber grundsätzlich kann man sicher sagen, dass bei CPython eine mit multiprocessing implementierte Applikation wegen des fehlenden GILs häufig schneller als langsamer ist, im Vergleich zu einer mit threading implementierten.
Verfasst: Samstag 3. April 2010, 10:38
von IoI
Also ich hab das Gefühl, das es sehr lange dauert bis so eine multiprocessing.Process gestartet ist (unter Windows XP mit Python2.5). Außerdem hab ich jetzt große Probleme die berechneten Daten und Statusinformationen zu bekommen. Naja, muss da wohl nochmal einiges an Gehirnschmalz reinstecken bis es läuft.
Verfasst: Dienstag 6. April 2010, 09:16
von IoI
Am liebsten würde ich jetzt mit multiprocessing.Pool arbeiten, da ich dann an einigen stellen Aufgaben parallel durchführen könnte. Ich möchte aber während der Rechnung einen Status bekommen und hab deswegen schon versucht eine Queue als Parameter zu übergeben. Ungefähr so:
Code: Alles auswählen
def aufgabe(queue):
queue.put(STATUS1)
erg1= funktion1()
queue.put(STATUS2)
erg2= funktion2()
#...
return gesamt
pool = multiprocessing.Pool(processes=ANZAHL)
q = multiprocessing.Queue()
job = pool.apply_async(aufgabe, (q,))
while not job.ready():
if not q.empty():
print q.get()
job.wait(0.5)
erg = job.get()
Das klappt allerdings nicht.
Verfasst: Dienstag 6. April 2010, 10:02
von philistion
Du findest ein sehr schönes Beispiel unter folgendem Link bei "Using Pool":
http://docs.python.org/library/multipro ... l#examples
Was ich vorher vergessen habe, diese Aussage kann man wahrscheinlich nur für Linux treffen, bei Mac OSX und vor allem bei Windows ist doch die multiprocessing Performance generell nicht so perfekt.
Du könntest den Benchmark, der beim o.g. Link ganz unten bei den Beispielen zu finden ist, mal auf deinem Windows-Rechner laufen lassen und die Ergebnisse hier posten. Würde mich interessieren.
Verfasst: Dienstag 6. April 2010, 10:13
von IoI
philistion hat geschrieben:Du findest ein sehr schönes Beispiel unter folgendem Link bei "Using Pool":
http://docs.python.org/library/multipro ... l#examples
Was ich vorher vergessen habe, diese Aussage kann man wahrscheinlich nur für Linux treffen, bei Mac OSX und vor allem bei Windows ist doch die multiprocessing Performance generell nicht so perfekt.
Du könntest den Benchmark, der beim o.g. Link ganz unten bei den Beispielen zu finden ist, mal auf deinem Windows-Rechner laufen lassen und die Ergebnisse hier posten. Würde mich interessieren.
Hallo philistion,
wie ich Pool benutze weiß ich, aber ich weiß nicht wie ich zwischen dem Starten und return einer Funktion im Pool noch zusätzliche Informationen austauschen kann.
Verfasst: Dienstag 6. April 2010, 11:55
von IoI
Nächste Problem: Ich kann mit Pool keine beliebigen Return-Werte übergeben. Crasht z.b. bei wx.Bitmap
Verfasst: Dienstag 6. April 2010, 12:42
von philistion
Ich bin mir zwar nicht sicher ob das die Wurzel des Problems ist, aber bei meiner Software benütze ich zum Datenaustausch zwischen multiprocessing-Processes die multiprocessing.Manager Klasse, wovon ich dann auch die Queue benütze.
Außerdem würde ich empfehlen auf Basis von multiprocessing.Process eine neue Klasse zu implementieren, in deren run()-Methode du den auszuführenden Code schreibst.
Folgender Code für die Klasse
Code: Alles auswählen
from multiprocessing import (Process)
class WorkerProcess(Process):
def __init__(self, queue):
Process.__init__(self)
self.queue = queue
def run(self):
...
while not self.queue.empty():
print self.queue.get()
...
Also folgender Code im Hauptprogramm
Code: Alles auswählen
import multiprocessing
...
def mainFunc():
...
manager = multiprocessing.Manager()
dataQueue = manager.Queue()
workerProc = WorkerProcess(dataQueue)
workerProc.start()
...
Verfasst: Dienstag 6. April 2010, 12:58
von jerch
@IoI:
Für den Datenaustausch gäbe es auch noch Pipes.
Beim Austausch von GUI-Typen mußt Du schauen, ob diese thread/process safe übergeben werden können (pickleable und nicht an den Mainthread gebunden). Alles was in Richtung Anzeige geht, dürfte auch mit dem multiprocessing-Modul nicht austauschbar sein bzw. zu unvorhersagbarem Verhalten führen.
Für die Bitmaps wäre die Übergabe der Daten in einem nicht Anzeigetypen und anschliessende Umwandlung zu einem Anzeigetypen möglich.