You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:04:54