如何在单独的线程中实例化 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 快速创建对象。
在 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 快速创建对象。