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

标签 python ctypes python-multiprocessing python-multithreading

我有一个用 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/

相关文章:

python - 如何在多层嵌套列表的中间插入?

python - 自定义pycharm IDE等emacs

python - 在Raspberry Pi上通过OpenCV编写的视频未运行

python - 无法在 python 中导入自定义 DLL

python - 将基于 ctypes 的代码片段从 Linux 移植到 Windows

c++ - 如何在 Python 中处理来自 C++ 的 PyObject*

python - 如何使用多处理 python 更新和检索图像?

python - 并行响应多个传入的Slack-Bot请求

python - 多处理组应用python

python - Django 根据子域使用不同的 settings.py 文件