В Python многопроцессорной обработки: Как закрыть многопроцессорной бассейн на исключение


Я использую многопроцессорную обработку python, чтобы разделить один из более длинных процессов и запустить его параллельно. Он работает нормально, за исключением тех случаев, когда есть исключение в одном из дочерних процессов, в этом случае пул процессов не закрыт, и я все еще могу видеть эти процессы на сервере.

Вот код:

from multiprocessing import Pool
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
pool.close()

def test_function(param_data,index):
   try:
      # The process here;
   except Exception as e:
      # Close the process pool;

На даче pool.close внутри блока except он говорит

NameError: глобальное имя 'pool' не определено

Я пытался убить процесс на исключении с помощью следующего кода.

    except Exception as e:
       import os
       import signal
       pid = os.getpid()
       os.kill(pid, signal.SIGTERM) 
Но я все еще могу видеть процесс на сервере. Это все еще не самое лучшее решение, так как это только завершит дочерний процесс, который столкнулся с исключением другие процессы все еще будут продолжаться. Я хочу, чтобы все процессы завершались по завершении, независимо от того, сталкиваются ли они с исключением или нет.

Я запускаю Python2. 7

Ps: Я не могу установить новую библиотеку, такую как psutil на сервере, я пытаюсь решение с использованием стандартной библиотеки python.

Я проверил несколько подобных вопросов, таких как, процесс автоматического убийства и ребенок в этом форуме, но они не были действительно этой проблемой.

1 4

1 ответ:

Я получил решение для этого-поймать исключение в Родительском процессе.

try:
   pool = Pool(processes=4)
   from functools import partial
   param_data = "Test Value"
   func = partial(test_function, param_data)
   r = pool.map(func, range(3))
except Exception as e:
   pool.close()
pool.close()

А также добавьте try / catch в функцию дочернего процесса:

def test_function(param_data,index):
    try:
       # The process here;
    except Exception as e:
       raise Exception(e.message)          

Блок except здесь выглядит избыточным, но это не так. Причина в том, что некоторые исключения, вызванные дочерним процессом, не были переданы родительскому процессу.

Например, я вызывал пользовательское исключение в функции, и оно не было брошено в родительский процесс, поэтому рекомендуется перехватывать все исключения в пределах дочерний процесс и поднять стандартное исключение оттуда, а затем обработать его в Родительском процессе, где вы можете закрыть пул процессов или сделать другие очистки.