Python Multiprocessing: Abort Map On First Child Error
What's the proper way of aborting multiprocessing when one of the child aborts and/or throw an Exception? I found various questions around that (generic multiprocessing error handl
Solution 1:
I think you're going to need apply_async for this, so you can act upon every single result instead of the cumulative result. pool.apply_async offers an error_callback parameter you can use to register your error-handler. apply_async is not blocking, so you'll need to join() the pool. I'm also using a flag terminated to know when results can be processed normally in case no exception occured.
from time import sleep
from multiprocessing import Pool
def f(x):
    sleep(x)
    print(f"f({x})")
    return 1.0 / (x - 2)
def on_error(e):
    global terminated
    terminated = True
    pool.terminate()
    print(f"oops:{e}")
def main():
    global pool
    global terminated
    terminated = False
    pool = Pool(4)
    results = [pool.apply_async(f, (x,), error_callback=on_error)
               for x in range(7)]
    pool.close()
    pool.join()
    if not terminated:
        for r in results:
            print(r.get())
    print("end")
if __name__ == '__main__':
    main()
Post a Comment for "Python Multiprocessing: Abort Map On First Child Error"