[英]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 上生成):
spawn :父进程启动一个新的 python 解释器进程。 子进程将仅继承运行进程对象的 run() 方法所需的资源。
fork :父进程使用 os.fork() 来分叉 Python 解释器。 子进程在开始时实际上与父进程相同。 父进程的所有资源都由子进程继承。
forkserver :当程序启动并选择 forkserver 启动方式时,会启动一个服务器进程。 从那时起,每当需要一个新进程时,父进程都会连接到服务器并请求它派生一个新进程。
如果要更改启动方法,则必须设置它。 例子:
import multiprocessing as mp
mp.set_start_method('spawn')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.