Очистка дочерних процессов в многопроцессорной - PullRequest
1 голос
/ 01 ноября 2019

Рассмотрим простую настройку дочернего процесса. По сути, это сценарий производитель (родитель) -потребитель (дочерний).

class Job:
    def start_process(self):
        self.queue = multiprocessing.Queue(3)
        self.process = multiprocessing.Process(target=run,
                                               args=(self.queue))

def run(queue):
    while True:
        item = queue.get()
        ....

Если я выполню kill -9 в родительском процессе, дочерний процесс будет зависать вечно. Я был уверен, что он получит SIGHUP, как с subprocess.Popen - когда процесс python выйдет, редактор popen также выйдет. Есть идеи как починить детскую уборку?

1 Ответ

0 голосов
/ 01 ноября 2019

Если параметр daemon не работает для вас, вы можете поймать сигнал SIGINT и установить для него логическое значение, чтобы выйти из цикла while у ваших детей. то есть ..

import signal

g_run_loops = True
def signal_handler(signum, frame):
   global g_run_loops
   g_run_loops = False

signal.signal(signal.SIGINT, signal_handler)

def run(queue):
    global g_run_loops
    while g_run_loops:
        item = queue.get()
        ....

Обратите внимание, что это не будет работать для SIGKILL (kill -9), но должно работать для SIGINT (kill -2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...