我有一个用 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
没问题。多处理使用不同的进程,并且不同的进程不能将任何内容覆盖到另一个进程地址空间中(除非明确要求)。
Load them inside a different multithreading instance
您只能加载该库的一个实例。话虽这么说,因为您只有一个库实例,从技术上讲并且取决于库,对函数的调用可能会覆盖库以前的内部状态。这在很大程度上取决于该库是否可以在多线程上下文中使用。
正如您所说,库保留内部状态,每次调用函数都有机会覆盖/更改先前的内部状态(取决于被调用函数对内部状态的影响)。
Load them in two different Jupyter notebooks with different kernel
取决于两个笔记本是否使用两个不同的解释器实例。
如果是运行两个笔记本的同一个解释器,那么该解释器只会加载一个库实例。
不同的解释器:两个进程 -> 两个库,每个库都有自己独立的状态。
Run them in different Python virtual environments
不同的虚拟环境使用不同的进程。
关于python - 在Python中加载两个动态库实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312646/