Abh*_*aji 6 opencv numpy gil python-3.x
我正在使用 numpy 和 opencv 对大量图像在 python3 中进行大量图像处理。我知道 python 有这个 GIL 可以防止两个线程同时运行。在 Google 上的快速搜索告诉我,不要将 Python 中的线程用于 CPU 密集型任务,仅将它们用于 I/O 或将文件保存到磁盘、数据库通信等。我还读到 GIL 在使用 C 扩展时被释放。由于 numpy 和 opencv 都是 C 和 C++ 扩展,我觉得 GIL 可能会发布。我不确定,因为图像处理是 CPU 密集型任务。我的直觉是正确的还是我更擅长使用多处理?
要预先回答这个问题,这取决于您使用的功能。
证明函数是否释放GIL的最有效方法是检查相应的源。检查文档也有帮助,但通常根本没有记录。是的,这很麻烦。
http://scipy-cookbook.readthedocs.io/items/Multithreading.html
[...]numpy 代码在计算时通常会释放 GIL,因此简单的并行性可以加快代码速度。
每个项目都可能使用自己的宏,因此如果您熟悉C Python API 中的Py_BEGIN_ALLOW_THREADS等默认宏,您可能会发现它们被重新定义。例如,在 Numpy 中,它是NPY_BEGIN_THREADS_DEF等等。