Как правильно прервать многопроцессорную обработку, когда один из детей прерывает работу и / или выдает исключение?
Я нашел несколько вопросов по этому поводу ( универсальная обработка многопроцессорных ошибок , как закрыть многопроцессорный пул при исключении, но без ответа , ...), но нет четкого ответа о том, как остановите многопроцессорную обработку для дочернего исключения.
Например, я ожидаю следующий код:
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()
Для вывода:
f(0)
f(1)
f(2)
oops: float division by zero
end
Вместо этого он применяет функцию f
ко всем элементам перед обнаружением / обработкой исключения:
f(0)
f(1)
f(2)
f(4)
f(3)
f(5)
f(6)
oops: float division by zero
end
Нет ли способа поймать исключение напрямую?