Python multiprocessing 支持嵌套启动多进程,但需在主进程设置启动方式并保护程序入口。
核心要点
- 主进程设置
multiprocessing.set_start_method() - 使用
if __name__ == '__main__': 保护入口 - Windows 必须用
spawn,Linux/macOS 可选 fork
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| import multiprocessing
import time
def nested_worker(num):
print(f"嵌套进程 {num} PID: {multiprocessing.current_process().pid}")
time.sleep(1)
def parent_worker(pid):
print(f"父进程 {pid} PID: {multiprocessing.current_process().pid}")
processes = []
for i in range(2):
p = multiprocessing.Process(target=nested_worker, args=(f"{pid}-{i}",))
processes.append(p)
p.start()
for p in processes:
p.join()
if __name__ == '__main__':
multiprocessing.set_start_method('spawn', force=True)
main_processes = []
for i in range(2):
p = multiprocessing.Process(target=parent_worker, args=(i,))
main_processes.append(p)
p.start()
for p in main_processes:
p.join()
|
常见问题
| 问题 | 原因 | 解决 |
|---|
| Windows RuntimeError | 未加入口保护 | 添加 if __name__ == '__main__': |
| 资源耗尽 | 嵌套层级过多 | 限制 2-3 层,使用 Pool |
| 进程间通信错误 | 直接共享变量 | 使用 Queue/Pipe |
建议
- 统一使用
spawn 保证跨平台兼容 - 嵌套进程用
join() 确保生命周期可控 - 使用
Pool 限制并发数
Comments