首页 > 解决方案 > ThreadPoolExecutor 如何将 32 个 CPU 核心用于 CPU 绑定任务

问题描述

ThreadPoolExecutor

在 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 绑定任务?

标签: pythonpython-3.xmultithreadinggil

解决方案


对,就是这样。由于 GIL 保护 Python 解释器状态,如果库有大量工作要做且不涉及访问 Python 变量或调用 Python 函数,则它可以释放锁。NumPy 就是这样一个经常可以做到这一点的库。


推荐阅读