python - 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% 确定。
解决方案
推荐阅读
- typescript - 基于输入的动态函数返回类型 - TypeScript
- python - pip 卸载包和唯一依赖项
- visual-studio-code - 如何将 VSCode 命令作为任务运行
- python - 糟糕的解释器:权限被拒绝
- javafx - JavaFx:由:java.lang.ClassCastException:无法转换为类引起
- go - 如何在 Hyperledger Fabric 中解组事务有效负载
- java - 为什么 JavaFX TableView 不显示数据?
- ios - 旋转,缩放后如何获得BoundingBox?
- javascript - HTML标签上没有滚动,但内容上滚动Y
- c# - 使用 Gmail API 的快速入门允许多个 OAuth 登录