Multiprocessamento Python: interromper o mapa no erro do primeiro filho
Qual é a maneira correta de interromper o multiprocessamento quando uma criança interrompe e / ou lança uma exceção?
Encontrei várias perguntas sobre isso (tratamento genérico de erros de multiprocessamento, como fechar o pool de multiprocessamento em exceção, mas sem resposta, ...), mas nenhuma resposta clara sobre como parar o multiprocessamento na exceção filho.
Por exemplo, espero o seguinte código:
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()
Para saída:
f(0)
f(1)
f(2)
oops: float division by zero
end
Em vez disso, aplica-sef
função em todos os itens antes de detectar / manipular a exceção:
f(0)
f(1)
f(2)
f(4)
f(3)
f(5)
f(6)
oops: float division by zero
end
Não há como capturar a exceção diretamente?