
在使用 Python 的 multiprocessing 模块时,若未调用 join() 等待子进程结束,主程序可能提前退出,导致子进程被强制终止,其输出(如 print)无法显示。
在使用 python 的 multiprocessing 模块时,若未调用 `join()` 等待子进程结束,主程序可能提前退出,导致子进程被强制终止,其输出(如 `print`)无法显示。
当你运行如下代码时:
def foo():
print("hello")
import multiprocessing as mp
task = mp.Process(target=foo)
task.start()
看似逻辑正确——定义了目标函数、创建并启动了进程——但程序很可能立即退出,而子进程 task 还未来得及执行 print("hello") 就被操作系统回收。这是因为:
- 主进程(main thread)在调用 task.start() 后继续向下执行;
- 由于没有后续语句,主进程迅速结束;
- 在大多数操作系统中,主进程终止会默认终止其所有子进程(尤其在 Windows 和部分 Linux 配置下),或至少导致子进程输出缓冲来不及刷新。
✅ 正确做法是显式等待子进程完成,使用 task.join():
def foo():
print("hello")
import multiprocessing as mp
task = mp.Process(target=foo)
task.start()
task.join() # ← 关键:阻塞主进程,直到 task 执行完毕
此时程序将稳定输出:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
hello
? 补充说明与注意事项:
- join() 是可选但强烈推荐的操作:它不仅确保输出可见,更是编写健壮多进程程序的基础(避免资源竞争、状态不一致等问题);
- join() 可接受超时参数(如 task.join(timeout=3)),防止无限等待;
- 若启动多个进程,应为每个进程调用 join()(通常放在 start() 之后统一处理);
- 在脚本末尾或关键同步点遗漏 join() 是初学者最常犯的 multiprocessing 错误之一;
- 注意:join() 只影响主进程对子进程的等待行为,不会影响子进程内部逻辑或输出机制。
总之,start() 启动进程,join() 保障其完成——二者配合,才是 multiprocessing 的标准实践。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










