繁体   English   中英

在 Python 进程之间共享导入

[英]Sharing imports between Python processes

我正在使用multiprocessing包来生成多个执行函数的进程,比如func (具有不同的参数)。 func导入numpy包,我想知道是否每个进程都会导入包。 事实上,主线程,或者更确切地说是主进程也导入了numpy ,并且可以很容易地在不同的func执行进程之间共享。

由于库的多次导入,将会对性能造成重大影响。

我想知道是否每个进程都会导入包。

假设导入发生在您分叉该过程之后,那么,是的。 不过,您可以通过在分叉之前进行导入来避免这种情况。

由于库的多次导入,将会对性能造成重大影响。

好吧,如果你在分叉之后进行导入,性能会受到影响,但可能不是“主要”的。 操作系统很可能在其缓存中包含所有必要的文件,因此它只会从 RAM 读取,而不是从磁盘读取。

更新

才注意到这个...

事实上,主线程,或者更确切地说是主进程也导入了numpy ...

如果您在分叉之前已经导入了numpy ,那么子流程中的导入只会创建对现有导入模块的引用。 这应该不到一毫秒,所以我不会担心。

该问题的答案在多处理库的文档中: https ://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods。

总结是这取决于您选择哪种启动方法。 有 3 种方法可用(在 Unix 上默认为 fork,在 Windows/Mac 上生成):

  1. spawn :父进程启动一个新的 python 解释器进程。 子进程将仅继承运行进程对象的 run() 方法所需的资源

  2. fork :父进程使用 os.fork() 来分叉 Python 解释器。 子进程在开始时实际上与父进程相同。 父进程的所有资源都由子进程继承。

  3. forkserver :当程序启动并选择 forkserver 启动方式时,会启动一个服务器进程。 从那时起,每当需要一个新进程时,父进程都会连接到服务器并请求它派生一个新进程

如果要更改启动方法,则必须设置它。 例子:

import multiprocessing as mp
mp.set_start_method('spawn')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM