Python 共享库

3
据我所知,Python(CPython)中有两种类型的模块: - .so(C扩展) - .py
.so只会在第一次被加载,即使有不同的进程/解释器导入它们。
.py会为每个进程/解释器加载一次(除非显式重新加载)。
是否有一种方法可以让.py被多个进程/解释器共享?
仍然需要一些层来存储对模块所做的修改。我认为可以将解释器嵌入到.so中作为第一步。是否已经开发出了这样的解决方案?
我承认我的想法可能非常不切实际,请原谅我的无知。

解释器已经嵌入在 libpythonX.Y.so.1.0 中。 - Ignacio Vazquez-Abrams
2
你为什么需要这个? - user395760
3个回答

1

.so(或.pyd)文件仅占用内存空间一次(除了它们的变量部分),原因是操作系统内核将其识别为目标代码。 .py 文件仅被识别为文本文件/数据; Python 解释器将其授予“代码”状态。将 Python 解释器嵌入共享库并不会解决这个问题。

尽管同一个.py文件在多个进程中使用,但只加载一次需要对 CPython 进行深层次的更改。

如果想要节省内存空间,则最好的选择是使用Cython将 Python 模块编译为.so文件。这可能需要对模块进行一些更改。


0

不,没有办法。Python非常高度动态化,以至于每个进程我都不确定是否有任何意义,因为您可以对模块进行猴子补丁等操作。也许仍然有一种方法可以共享代码,但是对于可能需要大量工作的东西来说,好处非常小。


0
我能给你的最好答案是“不是不可能,但我不知道是否已经实现”。
你必须想想实际上发生了什么。当你遇到一个 .py 文件时,Python 必须读取文件,编译它,然后执行字节码。编译在进程内部进行,因此无法共享。
当你遇到一个 .so 文件时,操作系统链接预留给该库的内存。所有进程共享同一内存区域,因此可以节省内存。
Python 已经有了第三种加载模块的方式。如果可以,在加载 .py 文件时,它会创建一个预编译的 .pyc 文件,这样加载速度更快(避免编译)。下一次加载 .pyc 文件。他们可以想象通过将 .pyc 文件映射到内存中来代替。 (使用 MAP_PRIVATE,以防其他东西稍后干扰该字节码。)如果他们这样做了,那么默认情况下,共享模块将最终进入共享内存。
我不知道是否已经以这种方式实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接