Python C,TBB,调用多个线程的函数

Python C, tbb, calling a function from multiple threads

本文关键字:线程 函数 调用 TBB Python      更新时间:2023-10-16

作为python c api的学习过程,我试图在函数内部调用python函数传递给tbb parallel_for。调用函数崩溃的操作Python进程的实例。我没有做任何不安全的事情。我从列表中获取项目,然后调用python函数,其中将项目作为参数传递给了该功能。最后,我将项目设置回列表。有什么提示我做错了什么?

当您从C 回电时,您很可能会忘记忘记抓住全局解释器锁(GIL)。例如,用于Python的TBB模块使用SWIG实现了这一点:

class PyCaller : public swig::SwigPtr_PyObject {
public:
  using swig::SwigPtr_PyObject::SwigPtr_PyObject; // gets constructors
  void operator()() const {
    SWIG_PYTHON_THREAD_BEGIN_BLOCK;
    PyObject* r = PyObject_CallFunctionObjArgs((PyObject*)*this, NULL);
    if(r) Py_DECREF(r);
    SWIG_PYTHON_THREAD_END_BLOCK;
  }
};
// Usage:
tbb::task_group tg;
void enqueue( PyObject *c ) {
    tg.run( PyCaller(c) );
}

您可以看到Swig的实现 - 在这里。

其他要考虑的选项包括使用Numba的@cfunc(nopython=True)装饰器和Cython的nogil属性,它们可以使功能更快,并且可以使Python的功能在从编译功能中删除GIL时并行运行。