Python共享库

时间:2011-02-21 16:31:14

标签: python multithreading dynamic multiprocessing dynamic-linking

据我所知,python中有两种类型的模块(CPython):   - .so(C扩展名)   - .py

即使有不同的进程/解释器导入它们,也只会加载一次.so

.py为每个进程/解释器加载一次(除非明确重新加载)。

有多种方法.py可以由多个进程/解释器共享吗?

人们仍然需要一些可以存储对模块进行修改的层。 我认为可以将解释器嵌入到.so中作为第一步。是否已经开发出解决方案。

我承认,就可行的想法而言,我可能还很遥远。请原谅我的无知。

3 个答案:

答案 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以防其他事情稍后与该字节代码混淆。)如果他们这样做,那么共享模块默认会在共享内存中结束。

我不知道它是否真的以这种方式实现了。