2017-04-02 1 views
0
Handhabung

Angesichts der folgende Programmstruktur ich nach einem Weg suchen, um:Python Multiprozessing Ausnahme

  • Prozess Kind Ausfälle in dem übergeordneten Detect

  • alle Prozesse beenden (Eltern und Kinder) und Ausgang mit Statuscode 1

  • Erzielen der oben ohne Lockerung der Warteschlangengröße max

Hier ist der Code:

import multiprocessing 


def worker1(queue1, queue2): 
    while True: 
     item = queue1.get() 
     if item == 10: 
      raise 
     if item == 'stop': 
      return 
     # do something with item that generates multiple queue entries 
     for x in xrange(1000): 
      queue2.put(x) 


def worker2(queue2, queue3): 
    while True: 
     item = queue2.get() 
     if item == 'stop': 
      return 
     # do something with item, only one result to pass to the next queue 
     queue3.put(1) 


def worker3(queue3): 
    while True: 
     item = queue3.get() 
     if item == 'stop': 
      return 
     # do something with item 


def main(): 
    queue1 = multiprocessing.Queue() 
    queue2 = multiprocessing.Queue(100) 
    queue3 = multiprocessing.Queue(100) 

    pool1 = multiprocessing.Pool(2, worker1, (queue1,queue2,)) 
    pool2 = multiprocessing.Pool(8, worker2, (queue2,queue3,)) 
    pool3 = multiprocessing.Pool(4, worker3, (queue3,)) 

    for i in xrange(100): 
     queue1.put(i) 
    for _ in range(pool1.__dict__['_processes']): 
     queue1.put('stop') 
    pool1.close() 
    pool1.join() 

    for _ in range(pool2.__dict__['_processes']): 
     queue2.put('stop') 
    pool2.close() 
    pool2.join() 

    for _ in range(pool3.__dict__['_processes']): 
     queue3.put('stop') 
    pool3.close() 
    pool3.join() 

    print 'finished' 

if __name__ == '__main__': 
    main() 

Dank!

+1

Funktioniert der Code? Wenn ja, gehen Sie zu CodeReview. Wenn nicht, erkläre uns das Problem. – Mikael

+0

Der Code funktioniert, aber der übergeordnete Prozess erkennt nicht abgefangene Ausnahmen in den Unterprozessen. Ich suche nach Hilfe, um sie zu erkennen und alle Prozesse (Eltern und Kinder) zu beenden, sobald eine nicht abgefangene Ausnahme ausgelöst wird. – Vlassios

+0

Nun, der übliche Weg, Ausnahmen zu fangen, ist zu verwenden: versuchen: ... außer: raise ~ Ausnahme geben Sie hier ~ ' – Mikael

Antwort

1

Sie missbrauchen die Objektehier.

Verwenden Sie anstelle von Objekten Process Objekte direkt.

Programmieren Sie die Worker-Funktionen zum Beenden mit einem Fehlercode, wenn eine Ausnahme ausgelöst wird.

Dann können Sie die Methode verwenden, um zu überprüfen, ob der Prozess noch läuft, und die exitcode Eigenschaft von toten Prozessen überprüfen.

Verwandte Themen