在 Python 中加载两个动态库实例
Loading two dynamic library instances in Python
我有一个用 Fortran 编写并编译(使用 -fPIC)为动态库的程序。我在 Python 中加载 CDLL 以执行一些数值计算。该库使用内部持久内存(在模块中)来保存中间值。我在 Windows 和 Linux 上工作(分别使用 .dll 和 .so)。动态库打包在Python模块里面,安装在lib子目录下。
如果我 运行 两个不同的 Python 脚本在同一台计算机上加载动态库,它们会得到一个单独的内存还是会访问同一个内存(因此,破坏结果)?
如果我:
,这会有什么影响:
- 将它们加载到不同的多处理实例中
- 将它们加载到不同的多线程实例中
- 将它们加载到两个具有不同内核的不同 Jupyter 笔记本中
- 运行 他们在不同的 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
不同的虚拟环境使用不同的进程。
我有一个用 Fortran 编写并编译(使用 -fPIC)为动态库的程序。我在 Python 中加载 CDLL 以执行一些数值计算。该库使用内部持久内存(在模块中)来保存中间值。我在 Windows 和 Linux 上工作(分别使用 .dll 和 .so)。动态库打包在Python模块里面,安装在lib子目录下。
如果我 运行 两个不同的 Python 脚本在同一台计算机上加载动态库,它们会得到一个单独的内存还是会访问同一个内存(因此,破坏结果)?
如果我:
,这会有什么影响:- 将它们加载到不同的多处理实例中
- 将它们加载到不同的多线程实例中
- 将它们加载到两个具有不同内核的不同 Jupyter 笔记本中
- 运行 他们在不同的 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
不同的虚拟环境使用不同的进程。