【发布时间】:2021-09-08 08:08:34
【问题描述】:
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(除非它被抢占)?
来自this answer,我怀疑这与此有关
将大部分时间花在旨在发布 GIL 的外部库中(如 NumPy)
这是否意味着 CPU 绑定任务的基于线程的并发实际上是可能的,前提是线程在“旨在释放 GIL”的一些专门设计的外部库中执行 CPU 绑定任务?
【问题讨论】:
-
用 C 编写的库可以释放 GIL,如果他们不需要它来做任何事情。
标签: python python-3.x multithreading gil