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

时间:2019-09-11 17:32:51

标签: pybind11

在从python调用的pybind11包装的c ++中,我可以这样做:

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才能实例化它吗?

1 个答案:

答案 0 :(得分:1)

是的,需要GIL。

创建python对象时,您正在与python解释器进行交互。在该过程的某个时刻,您需要获取GIL才能进行right

也就是说,创建<div class="outer"> <div class="inner"></div> </div>的过程可能很昂贵,不需要GIL,可以在另一个线程中完成。例如,您可以分配和初始化原始数据,然后将其传递给pybind11::array_t构造函数,以使用GIL快速创建对象。