使用线程在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++函数的主要内容,如果未能解决你的问题,请参考以下文章