В 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 ответ:
Я получил решение для этого-поймать исключение в Родительском процессе.
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 здесь выглядит избыточным, но это не так. Причина в том, что некоторые исключения, вызванные дочерним процессом, не были переданы родительскому процессу.
Например, я вызывал пользовательское исключение в функции, и оно не было брошено в родительский процесс, поэтому рекомендуется перехватывать все исключения в пределах дочерний процесс и поднять стандартное исключение оттуда, а затем обработать его в Родительском процессе, где вы можете закрыть пул процессов или сделать другие очистки.