Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用多个c++;python中使用线程的函数_C++_Python_Multithreading_Gil - Fatal编程技术网

C++ 调用多个c++;python中使用线程的函数

C++ 调用多个c++;python中使用线程的函数,c++,python,multithreading,gil,C++,Python,Multithreading,Gil,假设我有一个接受整数的C(++)函数,它通过python api绑定到(C)python,所以我可以从python调用它: import c_module c_module.f(10) 现在,我想把它并行化。问题是:在这种情况下,GIL是如何工作的?假设我有一个要处理的数字队列,一些工作线程(threading.Thread)并行工作,每个工作线程调用c_module.f(number),其中number是从队列中获取的 GIL锁定解释器与通常情况的不同之处在于,现在不需要解释器来计算c_mo

假设我有一个接受整数的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
,因为它是编译的。所以问题是:在这种情况下,处理是真正并行的?

当前执行C扩展代码的线程(GIL已显式发布)将并行运行。请参阅,了解您需要在扩展中执行的操作


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

我认为在python中使用线程不会获得太多速度。一个更好的方法是使用OpenMP并行化数字处理fortran函数,并使用矢量化数据调用它。python中的多处理对我的问题不是很好,因为每个
f
函数都需要返回一个巨大的浮点数矢量,如果没有共享内存,可能会非常昂贵。您的代码是什么?如果是这样的话,您是否在处理密集型部分释放GIL?是的,这是我的代码,但我不知道如何释放GIL。如果我这样做,我的C++函数将不会运行吉尔问题吗?出于您的目的,我希望您需要的是pythRexOnAlpthyTrand和pyyEnthApple线程宏,因为在Python中创建了线程。这将允许该线程与解释器(当前使用GIL的其他线程)和任何其他未等待GIL的线程(使用Py_BEGIN_allow_线程)并行运行。