首页 > 解决方案 > Windows 上的多处理:如何让子进程不必重新加载父进程加载的模块?

问题描述

我了解多处理在 linux 与 Windows 中的启动方式不同,其中 linux fork() 和 window spawn()

产卵

父进程启动一个新的 python 解释器进程。子进程将仅继承运行进程对象 run() 方法所需的那些资源。特别是,不会继承父进程中不必要的文件描述符和句柄。与使用 fork 或 forkserver 相比,使用这种方法启动进程相当慢。[适用于 Unix 和 Windows。Windows 和 macOS 上的默认设置。]


叉子

父进程使用 os.fork() 来分叉 Python 解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全地分叉多线程进程是有问题的。[仅在 Unix 上可用。Unix 上的默认值。]

我正在使用 Windows,并且我有一个脚本,我正在其中导入一些个人模块。

main.py进口test.py

import test
import multiprocessing as mp

def f(x,y):
   z = test.add(x,y)
   print(z)

if __name__ == '__main__':
   pool = mp.Pool(2)
   pool.map(f, [(x,x+1,) for x in [1,2]])

理想情况下,这将产生 2 个进程。我想要做的是确保这个过程中的每一个都不必再次重新导入test.py,因为这import test是一个超重的加载过程。

我相信如果我能找到一种方法将 Windows 切换为使用 fork 而不是 spawn,它可能会解决问题。但我不是 100% 确定。

标签: pythonwindowsforkpython-multiprocessingspawn

解决方案


推荐阅读