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 handling, how to close multiprocessing pool on exception but without answer, ...), but no clear answer on how to stop multiprocessing on child exception.
For instance, I expect the following code:
def f(x):
sleep(x)
print(f"f({x})")
return 1.0 / (x - 2)
def main():
with Pool(4) as p:
try:
r = p.map(f, range(7))
except Exception as e:
print(f"oops: {e}")
p.close()
p.terminate()
print("end")
if __name__ == '__main__':
main()
To output:
f(0)
f(1)
f(2)
oops: float division by zero
end
Instead, it applies f
function on all items before detecting/handling the exception:
f(0)
f(1)
f(2)
f(4)
f(3)
f(5)
f(6)
oops: float division by zero
end
Isn't there any way to catch the exception directly?
map
has finished. If you definitely want to usemap
there is no way to catch it any earlier, because the exception does not exist any earlier. So, the question is whether you want to stick tomap
or are looking for a custom solution? – Dekameter