threading.Thread von aussen beenden,abbrechen oder killen
@Dav1d: So richtig oder falsch wie man mit einer geratenen Zahl halt liegen kann.
@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.
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
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.
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.
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.
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:
Das klappt allerdings nicht.
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()
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
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.
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,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.
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.
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
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
Also folgender Code im Hauptprogramm
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()
...
Code: Alles auswählen
import multiprocessing
...
def mainFunc():
...
manager = multiprocessing.Manager()
dataQueue = manager.Queue()
workerProc = WorkerProcess(dataQueue)
workerProc.start()
...
@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.
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.