Python C,TBB,调用多个线程的函数
Python C, tbb, calling a function from multiple threads
作为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时并行运行。
相关文章:
- C++使用params创建线程函数会导致转换错误
- 如何在大函数中编写多线程函数?
- C++11:将矢量元素作为线程传递到线程函数中
- 线程函数中的c++参数更改
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 将项目插入 CTreeCtrl 时线程函数的奇怪行为
- C++ 线程函数通过引用传递
- 线程函数参数的前向声明不起作用
- 线程函数无法从堆上分配的缓冲区中读取字符
- 线程函数不打印
- C :如何在复杂模板类中指定线程函数
- 为什么我在C++线程函数调用中得到重复值?
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- 线程函数中的通用引用
- 如何同时启动两个具有不同线程函数的线程团队
- std::c++ 中的线程在设置线程函数时不会出错
- 对抽象类的引用不能传递给线程函数?
- 如何将ifstream作为参数传递给std ::线程函数
- 如何线程函数