使用线程在python中调用多个c++函数

Posted

技术标签:

【中文标题】使用线程在python中调用多个c++函数【英文标题】:call multiple c++ functions in python using threads 【发布时间】:2010-05-12 20:45:49 【问题描述】:

假设我有一个采用整数的 C(++) 函数,并且它使用 python api 绑定到 (C)python,所以我可以从 python 调用它:

import c_module
c_module.f(10)

现在,我想并行化它。问题是:在这种情况下 GIL 是如何工作的?假设我有一个要处理的数字队列,并且一些工作人员 (threading.Thread) 并行工作,他们每个人都调用 c_module.f(number),其中 number 是从队列中获取的。

与通常情况的不同之处在于,当 GIL 锁定解释器时,现在您不需要解释器评估 c_module.f,因为它已编译。那么问题来了:在这种情况下,处理真的是并行的吗?

【问题讨论】:

我认为在 python 中使用线程不会提高速度。更好的方法是使用 OpenMP 并行化数字运算 fortran 函数并使用矢量化数据调用它。 【参考方案1】:

当前执行明确释放 GIL 的 C 扩展代码的线程将并行运行。请参阅 http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock 了解您需要在扩展程序中执行的操作。

Python 线程对于 I/O 绑定执行或 GUI 响应最有用。我不会用线程执行 python-heavy 。如果您想要保证并行性,请查看multiprocessing 库。

【讨论】:

python 中的多处理对我的问题不是很好,因为每个f 函数都需要返回一个巨大的浮点数向量,并且如果没有共享内存,它可能会非常昂贵 c_module 是你的代码吗?如果是这样,您是否围绕处理密集型部分发布 GIL? 是的,这是我的代码,但我不知道如何发布 GIL。如果我这样做,我的 C++ 函数会在没有 GIL 问题的情况下运行吗? 出于您的目的,我希望您只需要 Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS 宏,因为线程是在 Python 中创建的。这将允许该线程与解释器(当前使用 GIL 的其他线程)以及不等待 GIL 的任何其他线程(使用 Py_BEGIN_ALLOW_THREADS)并行运行。

以上是关于使用线程在python中调用多个c++函数的主要内容,如果未能解决你的问题,请参考以下文章

C++如何运行多个可以随时调用的后台函数线程?

如何使用 std::thread C++ 生成多个调用相同函数的线程 [关闭]

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

C++多线程中调用python api函数

c++线程函数中如何调用该方法下的外部函数?

boost::python - 如何从 C++ 在自己的线程中调用 python 函数?