在从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才能实例化它吗?
答案 0 :(得分:1)
是的,需要GIL。
创建python对象时,您正在与python解释器进行交互。在该过程的某个时刻,您需要获取GIL才能进行right。
也就是说,创建<div class="outer">
<div class="inner"></div>
</div>
的过程可能很昂贵,不需要GIL,可以在另一个线程中完成。例如,您可以分配和初始化原始数据,然后将其传递给pybind11::array_t
构造函数,以使用GIL快速创建对象。