Python 3.x GIL是在PythonOpenCV使用多线程时发布的吗?

Python 3.x GIL是在PythonOpenCV使用多线程时发布的吗?,python-3.x,numpy,opencv,gil,Python 3.x,Numpy,Opencv,Gil,我正在使用python3对大量使用numpy和opencv的图像进行大量的图像处理。我知道python有一个GIL,它阻止两个线程同时运行。在Google上快速搜索告诉我,不要将python中的线程用于CPU密集型任务,只将它们用于I/O或将文件保存到磁盘、数据库通信等。我还了解到,在使用C扩展时,会释放GIL。因为NoMPI和OpenCV都是C和C++扩展,所以我感觉到吉尔可能被释放。我不确定它是因为图像处理是CPU密集型的任务。我的直觉是正确的还是我更擅长使用多处理?首先回答这个问题,这取决

我正在使用python3对大量使用numpy和opencv的图像进行大量的图像处理。我知道python有一个GIL,它阻止两个线程同时运行。在Google上快速搜索告诉我,不要将python中的线程用于CPU密集型任务,只将它们用于I/O或将文件保存到磁盘、数据库通信等。我还了解到,在使用C扩展时,会释放GIL。因为NoMPI和OpenCV都是C和C++扩展,所以我感觉到吉尔可能被释放。我不确定它是因为图像处理是CPU密集型的任务。我的直觉是正确的还是我更擅长使用多处理?

首先回答这个问题,这取决于您使用的函数

证明函数是否释放GIL的最有效方法是检查相应的源。此外,检查文档也会有所帮助,但通常都没有文档记录。是的,它很麻烦

[…]numpy code通常在计算GIL时释放GIL, 因此,简单的并行性可以加快代码的速度


每个项目都可能使用自己的宏,因此如果您熟悉C Python API中的默认宏,您可能会发现它们被重新定义。例如,在Numpy中,它将是
NPY\u BEGIN\u THREADS\u DEF
,等等。

这有一些关于opencv和python的多处理的信息。Tat问题似乎无法解决我的疑问,没有更多关于您正在做什么的细节,没有人能够回答。人们使用多处理,而且它是有效的。也许使用线程更快,但是所有python代码都是单线程的。如果执行过程在几个opencv函数调用中花费了大量时间,那么线程就可以了。至少对于opencv来说,情况似乎是这样的——例如,
imread
s将愉快地在多个线程上并行运行,同样地,将
VideoWriter
卸载到另一个线程会再次增加总体吞吐量。看看代码,在操纵Python对象的少数情况下(例如highgui回调),它们显式地重新获得了GIL。