Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python共享库_Python_Multithreading_Dynamic_Multiprocessing_Dynamic Linking - Fatal编程技术网

Python共享库

Python共享库,python,multithreading,dynamic,multiprocessing,dynamic-linking,Python,Multithreading,Dynamic,Multiprocessing,Dynamic Linking,据我所知,python(CPython)中有两种类型的模块: -.so(C扩展) -是的 即使有不同的进程/解释器导入.so,它们也只加载一次 为每个进程/解释器加载一次.py(除非显式重新加载) 有没有办法让多个进程/解释器共享.py 人们仍然需要一些层来存储对模块所做的修改。 我想我们可以将解释器嵌入到一个.中,作为第一步。是否有已开发的解决方案 我承认,在这方面,我可能离可行的想法还很远。请原谅我的无知。不,没有办法。Python是高度动态的,所以我不确定每个进程是否有任何意义,例如,您可

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

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

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

有没有办法让多个进程/解释器共享.py

人们仍然需要一些层来存储对模块所做的修改。 我想我们可以将解释器嵌入到一个.中,作为第一步。是否有已开发的解决方案


我承认,在这方面,我可能离可行的想法还很远。请原谅我的无知。

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

原因是
。因此
(或
.pyd
)文件只占用一次内存空间(变量段除外),因为它们被操作系统内核识别为目标代码
.py
文件仅识别为文本文件/数据;是Python解释器授予它们“代码”状态。在共享库中嵌入Python解释器无法解决此问题

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


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

我能给你的最佳答案是“不是不可能,但我不知道是否会发生”

你必须考虑实际发生的事情。当遇到.py文件时,Python必须读取该文件,编译它,然后执行字节码。编译发生在进程内部,因此无法共享

当您遇到.so文件时,操作系统会在内存中链接为该库保留的内容。所有进程共享相同的内存区域,因此可以节省内存

Python已经有了第三种加载模块的方法。如果可以,在加载.py文件时,它将创建一个预编译的.pyc文件,该文件加载速度更快(您可以避免编译)。下次加载.pyc文件时。可以想象,他们只需将.pyc文件映射到内存中,就可以创建该文件。(使用MAP_PRIVATE,以防以后其他东西弄乱了该字节码。)如果他们这样做了,那么共享模块将默认在共享内存中结束


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

解释器已经嵌入到
libpythonX.Y.so.1.0
中。为什么需要这个?