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

MacOS下Python multiprocessing子进程启动后立即退出问题咨询

问题产生原因

MacOS 平台下 Python 3.8 及以上版本,multiprocessing 模块默认的进程启动方式从 fork 改为了 spawn,这是输出异常的核心诱因。两种启动模式的核心差异如下:

  • fork:直接复制父进程的完整内存状态生成子进程,不需要重新导入主模块,子进程会继承父进程的标准输出绑定、缓冲区配置,旧版本Python默认用这个模式,基本不会出现输出丢失的问题。
  • spawn:会启动一个全新的、干净的Python解释器进程,重新导入主模块的所有代码后再执行目标函数,不会继承父进程的输出缓冲配置,默认采用块缓冲模式——也就是说print的内容会先存在内存缓冲区里,攒够一定大小才会刷到控制台,很多时候进程退出前缓冲区没触发刷新,内容就直接丢了。

另外你代码里if __name__ == '__main__'块中写的global p1, p2是无效代码,global关键字仅在函数内部声明全局变量时生效,顶级作用域下写这行没有任何作用,可以直接删掉。

对应解决方法

方法1:切回fork启动模式(最快兼容旧逻辑)

在创建进程前显式指定启动方式为fork,即可复现旧版本Python的运行行为,改动最小。注意set_start_method全局只能调用一次,必须放在主入口块的最开头。
修正后可直接运行的代码:

from multiprocessing import Process, set_start_method

def foo(): 
    print("Hello")
 
def foo2(): 
    print("Hello again")
 
if __name__ == '__main__':
    set_start_method('fork')
    print('program started')
    p1 = Process(target=foo) 
    p2 = Process(target=foo2) 
    print(p1.is_alive())
    
    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

注意:MacOS 系统的 Objective-C 运行时和fork模式存在已知兼容性问题,部分涉及系统GUI、系统框架调用的场景下可能触发随机崩溃,苹果已经逐步在新系统中限制fork的使用,长期来看更推荐适配spawn模式。

方法2:适配spawn默认模式(官方推荐,跨平台兼容)

不需要修改启动方式,只需要给所有子进程里的print语句加上flush=True参数,强制每次打印都立刻刷新缓冲区,就可以避免输出丢失。如果在IDE中运行依然看不到输出,可以直接打开系统终端执行脚本——部分IDE的输出捕获逻辑对spawn子进程的兼容不好,终端运行不存在这个问题。
适配spawn模式的代码:

from multiprocessing import Process

def foo(): 
    print("Hello", flush=True)
 
def foo2(): 
    print("Hello again", flush=True)
 
if __name__ == '__main__':
    print('program started')
    p1 = Process(target=foo) 
    p2 = Process(target=foo2) 
    print(p1.is_alive())
    
    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

如果是更复杂的多进程输出场景,也可以通过multiprocessing.Pipe或者Queue把子进程的输出内容传回父进程,由父进程统一打印,稳定性更高。

内容的提问来源于stack exchange,提问作者dloc1001001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:48:31