张芷铭的个人博客

Python multiprocessing 支持嵌套启动多进程,但需在主进程设置启动方式并保护程序入口。

核心要点

  1. 主进程设置 multiprocessing.set_start_method()
  2. 使用 if __name__ == '__main__': 保护入口
  3. 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