如何在单独的线程中实例化 pybind11::array_t

how to instantiate pybind11::array_t in separate thread

在 pybind11-wrapped c++ 中,从 python 调用,我可以这样做:

py::array_t<double> t1 = py::array_t<double>(3);

但是:如果我在单独的线程中执行此操作,它会因分段错误而崩溃(实际上它似乎在 t1 超出范围或被破坏时崩溃)。

我可以通过

解决这个问题
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

pybind11::array_t<double> t1 = pybind11::array_t<double>(3)

PyGILState_Release(gstate);

很明显 pybind11::array_t 中有一些依赖于 GIL 的东西。一定如此吗?我是否必须获取 GIL 才能实例化它?

是的,需要 GIL。

当您创建一个 python 对象时,您正在与 python 解释器进行交互。在这个过程的某个时刻,你需要获得 GIL 才能做到这一点

也就是说,pybind11::array_t 的创建可能有昂贵的部分不需要 GIL,可以在另一个线程中完成。例如,您可以分配和初始化原始数据并将其传递给 pybind11::array_t 构造函数以使用 GIL 快速创建对象。