【问题标题】:Python Shared LibrariesPython 共享库
【发布时间】:2011-02-21 16:31:13
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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

标签: python multithreading dynamic multiprocessing dynamic-linking


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    不,没有办法。 Python 非常动态,以至于我不确定它是否有意义的每个进程,例如,您可以对模块进行猴子补丁。也许无论如何都会有一种共享代码的方法,但是对于可能需要大量工作的事情来说,好处会非常小。

    【讨论】:

      【解决方案3】:

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

      您必须考虑实际发生的情况。当您遇到 .py 文件时,Python 必须读取该文件,对其进行编译,然后执行字节码。编译发生在进程内部,因此不能共享。

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

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

      我不知道它是否真的是这样实现的。

      【讨论】:

        猜你喜欢
        • 2018-05-25
        • 2013-03-28
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多