为何创建两个Python multiprocessing子进程仅输出主函数内容?
多进程子进程无输出的核心原因
- 你遇到的输出缺失,本质是主进程执行过快,未等待子进程完成执行就直接退出,导致后台子进程被操作系统强制终止。
- 具体执行逻辑拆解:
- 调用
Process.start()方法仅代表向操作系统提交子进程创建申请,子进程需要完成Python解释器初始化、模块加载、目标函数准备等前置流程,本身存在启动延迟。 - 提交两个子进程的启动申请后,主进程会立刻执行后续的计时、打印运行时长逻辑,这部分操作耗时仅几十毫秒,远短于子进程完成启动、执行打印逻辑的时间。
- 主进程执行完全部代码后,会默认直接终止,操作系统会回收当前进程组的所有资源,尚未完成执行的两个子进程会被直接杀掉,因此你看不到
sleepy_man函数内部的任何打印输出,测试得到的0.05秒仅为主进程自身的运行耗时,完全没有计入子进程的执行时间。
- 调用
- 你参照的教程示例中一定包含等待子进程结束的逻辑,练习时遗漏了这部分代码,才会出现运行结果和示例不符的情况。
修复实现
需要做两处调整:
- 主进程启动子进程后,显式调用每个子进程的
join()方法,阻塞主进程的执行流,直到对应子进程完全运行结束,再继续执行主进程的后续逻辑。 - 适配Windows系统的多进程启动规则,将主进程启动相关的代码放到
if __name__ == "__main__":的判断块中,避免spawn模式下出现无限递归创建进程的异常。
修复后的完整可运行代码:
import multiprocessing import time def sleepy_man(): print("Starting to Sleep") time.sleep(1) print("Done Sleeping") if __name__ == "__main__": tic = time.time() p1 = multiprocessing.Process(target=sleepy_man) p2 = multiprocessing.Process(target=sleepy_man) p1.start() p2.start() # 阻塞等待两个子进程执行完成 p1.join() p2.join() toc = time.time() print("Done in {:.4f} seconds".format(toc-tic))
修复后运行的预期效果:
两个子进程会并行执行,总运行耗时约1秒(不会是顺序执行的2秒),完整输出类似:
Starting to Sleep Starting to Sleep Done Sleeping Done Sleeping Done in 1.0192 seconds
内容的提问来源于stack exchange,提问作者Ritik Kumar
相关产品推荐
相关产品推荐

