簡體   English   中英

在多處理中清理子進程

[英]Cleanup child processes in 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 ,則子進程將永遠掛起。 我確信它會像subprocess.Popen一樣接收SIGHUP - 當 python 進程退出時, popen ed也會退出。 知道如何解決兒童清理問題嗎?

如果daemon參數對您不起作用,您可以捕獲一個 SIGINT 信號並讓它設置一個 boolean 值以退出您的孩子的 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)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM