python - ThreadPoolExecutor 如何将 32 个 CPU 核心用于 CPU 绑定任务
问题描述
在 3.8 版更改: max_workers 的默认值更改为 min(32, os.cpu_count() + 4)。此默认值为 I/O 绑定任务保留至少 5 个工作人员。它使用最多 32 个 CPU 内核来执行释放 GIL 的 CPU 绑定任务。它避免了在多核机器上隐式使用非常大的资源。
根据我对 GIL 的理解,基于线程的并发仅适用于 I/O 绑定任务。对于 CPU 绑定任务,基于线程的并发是不可能的,这意味着对于 CPU 绑定任务,GIL 仅强制单线程执行。我的理解似乎与ThreadPoolExecutor
. 我在这里有什么误解?
此外,什么
释放 GIL
意思是?CPU 绑定的任务不会保留 GIL(除非它被抢占)?
从这个答案,我怀疑这与
将大部分时间花在旨在发布 GIL 的外部库中(如 NumPy)
这是否意味着 CPU 绑定任务的基于线程的并发实际上是可能的,前提是线程在一些专门设计的外部库“旨在释放 GIL”中执行 CPU 绑定任务?
解决方案
对,就是这样。由于 GIL 保护 Python 解释器状态,如果库有大量工作要做且不涉及访问 Python 变量或调用 Python 函数,则它可以释放锁。NumPy 就是这样一个经常可以做到这一点的库。
推荐阅读
- c# - 通过从字典访问添加委托时,事件为空
- javascript - 在javascript中围绕路径制作正弦波曲线
- python - 多线程是否有可能提取从外部源流式传输的全局变量?
- android - Android Studio Emulator:进程退出,错误代码为 1
- python-3.x - Pandas Python 如何使用一个数据帧中的通用数据写入不同的数据帧?
- mysql - MySQL SUM 长文本字段,$1.000.00 为 1000
- python - pyqt5 归一化向量
- c - C 结构数组,包含指向结构数组的指针
- javascript - 如果媒体宽度 < x 则更改 HTML
- django - 无法使用 django-filter 过滤