考虑子进程的简单设置。基本上,这是一个生产者(父)消费者(子)场景。
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也将退出。知道如何解决儿童清理问题吗?
答案 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)。