Как прекратить многопроцессорность (в Linux) после возникновения исключения в подчиненной задаче?

В следующем коде показан пример программы, вызывающей исключение в многопроцессорной задаче. Если я запускаю его (в среде 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

Я вижу, что программа все еще выполняется и не заканчивается вообще.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, в чем проблема без отладки, но я бы начал с удаления вызовов sys.exit и pool.teeminate из файла on_error. Это может мешать работе pool.join. Также не нужен pool.close. Связанный вопрос: как завершить процесс с помощью многопроцессорной обработки Python

Другие вопросы по теме