【问题标题】:how to instantiate pybind11::array_t in separate thread如何在单独的线程中实例化 pybind11::array_t
【发布时间】:2019-09-11 17:32:51
【问题描述】:

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

【问题讨论】:

    标签: pybind11


    【解决方案1】:

    是的,需要 GIL。

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      相关资源
      最近更新 更多