threading.Thread von aussen beenden,abbrechen oder killen

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Donnerstag 1. April 2010, 20:12

Leonidas hat geschrieben:
Dav1d hat geschrieben:Multiprocessing wäre auch noch schneller als Threading
Ooch, es gibt schon durchaus Systeme wo das starten von Prozessen hohen Overhead hat, so dass man das nicht prinzipiell sagen kann...
Auf Python bezogen, in 95% aller Fälle
the more they change the more they stay the same
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 1. April 2010, 20:20

Dav1d hat geschrieben:Auf Python bezogen, in 95% aller Fälle
Du meinst, 95% aller Python-User sind auf Windows order 95% aller Python-User sind auf Linux?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Donnerstag 1. April 2010, 21:08

Nein, In 95% aller Fälle ist multiprocessing schneller als Threading, bezogen auf Python
the more they change the more they stay the same
BlackJack

Donnerstag 1. April 2010, 21:40

@Dav1d: Kannst Du die Zahl belegen oder ist die einfach nur ausgedacht!?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Freitag 2. April 2010, 16:00

Du fragst mich Sachen, ich meine die Zahl (95) mal in einem Vortrag gehört zu haben
Lieg ich denn falsch?
the more they change the more they stay the same
BlackJack

Freitag 2. April 2010, 16:14

@Dav1d: So richtig oder falsch wie man mit einer geratenen Zahl halt liegen kann.
lunar

Freitag 2. April 2010, 16:14

@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.
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Freitag 2. April 2010, 21:17

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.
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Samstag 3. April 2010, 10:38

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.
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Dienstag 6. April 2010, 09:16

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.
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Dienstag 6. April 2010, 10:02

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.
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Dienstag 6. April 2010, 10:13

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.
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Dienstag 6. April 2010, 11:55

Nächste Problem: Ich kann mit Pool keine beliebigen Return-Werte übergeben. Crasht z.b. bei wx.Bitmap
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Dienstag 6. April 2010, 12:42

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()
    ...
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Dienstag 6. April 2010, 12:58

@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.
Antworten