gpt4 book ai didi

Python C,待定,从多个线程调用一个函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:56 25 4
gpt4 key购买 nike

作为 Python C API 的学习过程,我试图在传递给 tbb parallel_for 的仿函数中调用 Python 函数。调用函数的操作导致 Python 进程实例崩溃。我没有做任何线程不安全的事情。我从列表中获取该项目,然后调用一个 Python 函数,并将该项目作为参数传递给该函数。最后,我将该项目设置回列表。有什么提示我做错了什么吗?

最佳答案

当您从 C++ 调用 Python 函数时,您很可能忘记获取全局解释器锁 (GIL)。例如,Python 的 TBB 模块 implements this使用 :

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 如何实现它 - here .

要考虑的其他选项包括使用 Numba 的 @cfunc(nopython=True)装饰器和 Cython 的 nogil这些属性既使函数更快,又使 Python 的函数能够并行运行,因为它们从编译函数中删除了 GIL。

关于Python C,待定,从多个线程调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com