В следующем коде показан пример программы, вызывающей исключение в многопроцессорной задаче. Если я запускаю его (в среде Linux), скрипт/программа никогда не завершается.
Что мне нужно сделать, чтобы успешно завершить программу / продолжить работу после того, как в задаче возникло исключение?
from multiprocessing import Pool
from multiprocessing import cpu_count
import traceback
import sys
def myTask(runNumber, _):
if runNumber > 6:
raise ValueError(runNumber)
else:
return runNumber
def on_error(e):
traceback.print_exception(type(e), e, e.__traceback__)
global terminated
terminated = True
pool.terminate()
print(f"oops:{e}")
sys.exit()
if __name__ == '__main__':
myCpuCount = cpu_count()
print("myCpuCount = ", myCpuCount)
pool = Pool(myCpuCount)
myResult = [pool.apply_async(myTask, (runNumber, 1), error_callback=on_error)
for runNumber in range(15)]
pool.close()
pool.join()
myResult = [r.get() for r in myResult]
print("myResult = ", myResult)
Выход:
/home/user/venv/numba/bin/python3.6 /home/user/PycharmProjects/myProject/attic03.py
myCpuCount= 4
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "/home/user/PycharmProjects/myProject/attic03.py", line 10, in myTask
raise ValueError(runNumber)
ValueError: 7
"""
The above exception was the direct cause of the following exception:
ValueError: 7
oops:7
Я вижу, что программа все еще выполняется и не заканчивается вообще.
Не уверен, в чем проблема без отладки, но я бы начал с удаления вызовов sys.exit и pool.teeminate из файла on_error. Это может мешать работе pool.join. Также не нужен pool.close. Связанный вопрос: как завершить процесс с помощью многопроцессорной обработки Python