在 Python 中加载两个动态库实例

Loading two dynamic library instances in Python

我有一个用 Fortran 编写并编译(使用 -fPIC)为动态库的程序。我在 Python 中加载 CDLL 以执行一些数值计算。该库使用内部持久内存(在模块中)来保存中间值。我在 Windows 和 Linux 上工作(分别使用 .dll 和 .so)。动态库打包在Python模块里面,安装在lib子目录下。

如果我 运行 两个不同的 Python 脚本在同一台计算机上加载动态库,它们会得到一个单独的内存还是会访问同一个内存(因此,破坏结果)?

如果我:

,这会有什么影响:

有一个similar question。但是,由于动态库包含在 Python 模块中,我想避免重命名和移动文件。

If I run two different Python scripts that load the dynamic library on the same computer, would they get a separate internal memory or will they access the same one (thus, corrupting the results)?

  • 同一个库只能加载一次;更准确地说,只要您尝试加载具有相同路径的库,它只会在此过程中加载一次。

    • 现在假设您加载了一个库,将该库复制/粘贴到别处,重命名并尝试加载副本,然后它被加载了两次。
  • 至于多次加载同一个库所占用的内存,因为你只加载了一个库,所以没有损坏。如果您加载它的副本,那么每个库都会获得自己的内存分配。

Load them inside a different multiprocessing instance

没问题。 multiprocessing 使用不同的进程,不同的进程不能将任何内容覆盖到另一个进程地址 space(除非 明确 要求)。

Load them inside a different multithreading instance

您将只能加载库的一个实例。话虽这么说,因为您只有一个库实例,技术上 并且取决于库 ,对函数的调用可能会覆盖库的先前内部状态。这在很大程度上取决于该库是否可以在多线程上下文中使用。

正如你所说,库保持内部状态,每次调用函数都有机会覆盖/更改以前的内部状态(取决于被调用函数对内部状态的影响)。

Load them in two different Jupyter notebooks with different kernel

取决于两个笔记本是否使用两个不同的解释器实例。

  • 如果它是同一个解释器 运行 两个笔记本,那么解释器只加载了一个库实例。

  • 不同的解释器:两个进程 -> 两个库,每个库都有自己的独立状态。

Run them in different Python virtual environments

不同的虚拟环境使用不同的进程。