使用线程在Python中调用多个C++函数

3
假设我有一个接受整数参数的C(++)函数,并且使用Python API与Python绑定,因此我可以从Python中调用它:
import c_module
c_module.f(10)

现在,我想并行化它。问题是:在这种情况下GIL如何工作?假设我有一个数字队列需要处理,并且有一些工人(threading.Thread)并行工作,每个工人都调用c_module.f(number),其中number取自队列。
与通常情况下GIL锁定解释器的情况不同的是,现在您不需要解释器来评估c_module.f,因为它已经被编译。所以问题是:在这种情况下,处理是否真正并行?

我认为在Python中使用线程不会带来太大的速度提升。更好的方法是使用OpenMP并行化数值计算Fortran函数,并使用矢量化数据调用它。 - Maik Beckmann
1个回答

4

Python中的多进程对我的问题来说并不是很好,因为每个f函数需要返回一个大量的浮点数向量,如果没有共享内存,这可能会非常昂贵。 - Ruggero Turra
c_module是你的代码吗?如果是,你是否在处理密集型部分时释放了GIL锁? - Jeremy Brown
是的,这是我的代码,但我不知道如何释放全局解释器锁(GIL)。如果我这样做了,我的C++函数会在没有GIL问题的情况下运行吗? - Ruggero Turra
2
针对你的需求,我认为你只需要使用 Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS 宏即可,因为线程是在 Python 中创建的。这将使该线程能够与解释器(当前拥有 GIL 的其他线程)以及任何不在等待 GIL 的其他线程(使用 Py_BEGIN_ALLOW_THREADS)并行运行。 - Jeremy Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接