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

在Python中加载两个动态库实例,python,ctypes,python-multiprocessing,python-multithreading,Python,Ctypes,Python Multiprocessing,Python Multithreading,我有一个用Fortran编写的程序,并作为动态库编译(使用-fPIC)。我用Python中的CDLL加载以执行一些数值计算。该库使用内部持久内存(在模块中)保存中间值。我在Windows和Linux上工作(分别使用.dll和.so)。动态库打包在Python模块中,并安装在lib子目录中 如果我在同一台计算机上运行两个加载动态库的不同Python脚本,它们会获得单独的内存还是访问同一个内存(从而破坏结果) 如果我: 将它们加载到不同的多处理实例中 将它们加载到不同的多线程实例中 将它们加载到两

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

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

如果我:

  • 将它们加载到不同的多处理实例中
  • 将它们加载到不同的多线程实例中
  • 将它们加载到两个不同内核的Jupyter笔记本电脑中
  • 在不同的Python虚拟环境中运行它们
有一个问题。但是,由于动态库包含在Python模块中,因此我希望避免重命名和移动文件

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

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

    • 现在假设加载一个库,将该库复制/粘贴到其他位置,重命名它并尝试加载副本,然后加载两次
  • 对于同一个库多次加载所使用的内存,由于只加载了一个库,因此没有损坏。如果您加载它的一个副本,那么每个库都会获得自己的内存分配

将它们加载到不同的多处理实例中

没问题。多处理使用不同的进程,不同的进程无法将任何内容覆盖到另一个进程地址空间中(除非明确要求

将它们加载到不同的多线程实例中

您将只能加载库的一个实例。也就是说,由于您只有一个库实例,从技术上讲是,并且根据库的不同,对函数的调用可能会覆盖库以前的内部状态。这在很大程度上取决于库是否可以在多线程环境中使用

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

将它们加载到两个不同内核的Jupyter笔记本电脑中

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

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

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

在不同的Python虚拟环境中运行它们


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

太棒了,正是我想要的!节省了我几个小时的测试!