在多处理中清理子进程

时间:2019-10-31 21:19:41

标签: python python-2.7 multiprocessing python-multiprocessing

考虑子进程的简单设置。基本上,这是一个生产者(父)消费者(子)场景。

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 ed也将退出。知道如何解决儿童清理问题吗?

1 个答案:

答案 0 :(得分:0)

如果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(杀死-9),但应该适用于SIGINT(杀死-2)。