[英]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.