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!
Funktioniert der Code? Wenn ja, gehen Sie zu CodeReview. Wenn nicht, erkläre uns das Problem. – Mikael
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
Nun, der übliche Weg, Ausnahmen zu fangen, ist zu verwenden: versuchen: ... außer: raise ~ Ausnahme geben Sie hier ~ ' – Mikael