据我所知,python中有两种类型的模块(CPython): - .so(C扩展名) - .py
即使有不同的进程/解释器导入它们,也只会加载一次.so
.py为每个进程/解释器加载一次(除非明确重新加载)。
有多种方法.py可以由多个进程/解释器共享吗?
人们仍然需要一些可以存储对模块进行修改的层。 我认为可以将解释器嵌入到.so中作为第一步。是否已经开发出解决方案。
我承认,就可行的想法而言,我可能还很遥远。请原谅我的无知。
答案 0 :(得分:1)
.so
(或.pyd
)文件仅占用内存空间一次(除了它们的变量段)的原因是它们被OS内核识别为目标代码。 .py
个文件仅被识别为文本文件/数据;它是Python解释器,授予它们“代码”状态。将Python解释器嵌入共享库中无法解决此问题。
尽管在多个进程中使用.py
个文件,但只需加载.so
个文件就需要在CPython内部进行更改。
如果要节省内存空间,最好的选择是使用Cython将Python模块编译为{{1}}个文件。这可能需要对模块进行一些更改。
答案 1 :(得分:0)
不,没有办法。 Python是如此高度动态,以至于我不确定它的每个过程都会有任何意义,例如,你可以对模块进行修补。也许有一种方法可以分享代码,但对于可能需要大量工作的东西,这样做的好处非常小。
答案 2 :(得分:0)
我能给你的最佳答案是“并非不可能,但我不知道是否会发生这种情况”。
你必须考虑实际发生的事情。遇到.py文件时,Python必须读取文件,编译它,然后执行字节代码。编译发生在流程内部,因此无法共享。
当您遇到.so文件时,操作系统会在内存中为该库保留链接。所有进程共享相同的内存区域,因此可以节省内存。
Python已经有第三种加载模块的方法。如果可以,在加载.py文件时,它会创建一个预编译的.pyc文件,加载速度更快(避免编译)。下次加载.pyc文件时。他们可以想象.pyc文件只需将其映射到内存中即可。 (使用MAP_PRIVATE以防其他事情稍后与该字节代码混淆。)如果他们这样做,那么共享模块默认会在共享内存中结束。
我不知道它是否真的以这种方式实现了。