python-opencv 使用多线程时是否释放了 GIL?

Is the GIL released while using multithreading with python-opencv?

我正在 python3 使用 numpy 和 opencv 对一大批图像进行大量图像处理。我知道 python 有这个 GIL 可以防止两个线程 运行 同时发生。对 Google 的快速搜索告诉我,不要将 python 中的线程用于 CPU 密集型任务,仅将它们用于 I/O 或将文件保存到磁盘、数据库通信等. 我还读到 GIL 在使用 C 扩展时被释放。由于 numpy 和 opencv 都是 C 和 C++ 扩展,我感觉 GIL 可能 released.I 我不确定,因为图像处理是一项 CPU 密集型任务。我的直觉是正确的还是我更适合使用多处理?

要提前回答,这取决于您使用的功能。

证明函数是否释放GIL最有效的方法是查看对应的源码。检查文档也有帮助,但通常根本没有记录。是的,这很麻烦。

http://scipy-cookbook.readthedocs.io/items/Multithreading.html

[...] numpy code often releases the GIL while it is calculating, so that simple parallelism can speed up the code.

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