首页 > 解决方案 > 在多处理中清理子进程

问题描述

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

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 进程退出时,popened 也会退出。知道如何解决儿童清理问题吗?

标签: pythonpython-2.7multiprocessingpython-multiprocessing

解决方案


如果daemon参数对您不起作用,您可以捕获一个 SIGINT 信号并让它设置一个布尔值以退出您的孩子的 while 循环。IE..

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)。


推荐阅读