我正在尝试运行一个 python 脚本,该脚本生成一个子解释器和一个主解释器,每个解释器负责执行某种工作(基于本文中使用的示例)。我让两个解释器所做的工作都涉及使用 NumPy 库,当我运行代码时,出现以下错误:
_xxsubinterpreters.RunFailedError: <class 'ImportError'>: Error importing numpy:
you should not try to import numpy from its source directory; please exit
the numpy source tree, and relaunch your python interpreter from there.
我最初怀疑这与我的 NumPy 安装有关,但在 Real Python writeup on Python 3.12 Subinterpreters:
中发现了这一点随着 GIL 转变为每解释器状态,这种保证的线程安全性就被消除了。为了防止现有扩展模块中存在大量错误或未采用 Python 3.12,添加了一些方法,以便当您想要导入模块时,Python 可以首先确定它是否已准备好支持此新功能。
并且:
注意:如果具有每个解释器 GIL 的子解释器尝试导入不支持此功能的模块,则 Python 将引发 ImportError。
难道只是Python/C API 3.12 Interpreters模块中的Interpreters模块还不支持NumPy?否则,我不确定问题是什么。
是的,大多数 C 扩展模块(包括 Numpy)目前不支持多个子解释器。 这与:-
他们为什么没有启用多个子解释器支持?
这是因为多个子解释器不支持来自 C 扩展模块的常用 API(例如
PyGILState_*
API)。有关更多详细信息,请参阅 Python 文档中的注意事项部分。因此,目前允许大多数 C 扩展模块通过多个子解释器运行是不明智的。
如果您想了解更多相关内容,可以查看链接的文章我写的内容涵盖了我使用子解释器实现并行性的经验。