Python多进程场景下,如何从一个进程终止另一个进程?
问题分析与解决方案
你的代码核心问题在于:多进程是相互独立的执行单元,loop_a里的sys.exit()只会终止自身进程,和loop_b完全无关;而你尝试的Process(target=loop_b).close()是创建了一个全新的loop_b进程实例再关闭,根本不是正在运行的那个进程,所以起不到终止作用。
下面提供两种可行的解决方案:
方法一:通过进程ID(PID)强制终止loop_b
在主进程中保存loop_b的PID,将其传递给loop_a,loop_a触发终止逻辑时,通过系统信号结束loop_b进程:
from multiprocessing import Process import time import sys import os import signal def loop_a(b_pid): counter = 0 while True: print("a") time.sleep(1) counter += 1 if counter == 10: print("I want to stop the loop_b") # 发送终止信号给loop_b进程 os.kill(b_pid, signal.SIGTERM) sys.exit() def loop_b(): while True: print("b") time.sleep(1) if __name__ == '__main__': b_process = Process(target=loop_b) b_process.start() # 将loop_b的PID传入loop_a Process(target=loop_a, args=(b_process.pid,)).start()
注:Windows系统下若
signal.SIGTERM无效,可替换为signal.SIGBREAK。
方法二:用共享事件让loop_b主动退出(推荐)
这种方式更优雅,避免强制终止进程带来的资源泄漏风险,让loop_b主动检测退出信号:
from multiprocessing import Process, Event import time import sys def loop_a(stop_b_event): counter = 0 while True: print("a") time.sleep(1) counter += 1 if counter == 10: print("I want to stop the loop_b") # 设置事件,通知loop_b停止 stop_b_event.set() sys.exit() def loop_b(stop_b_event): while not stop_b_event.is_set(): print("b") time.sleep(1) print("loop_b is stopped") if __name__ == '__main__': # 创建跨进程共享的事件对象 stop_event = Event() b_process = Process(target=loop_b, args=(stop_event,)) b_process.start() Process(target=loop_a, args=(stop_event,)).start()
这种方法允许loop_b在退出前执行清理操作,稳定性更强。
内容的提问来源于stack exchange,提问作者Maiinjoon
相关产品推荐
相关产品推荐

