【问题标题】:How does ThreadPoolExecutor utilise 32 CPU cores for CPU bound tasksThreadPoolExecutor 如何利用 32 个 CPU 核来执行 CPU 绑定任务
【发布时间】:2021-09-08 08:08:34
【问题描述】:

来自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(除非它被抢占)?

来自this answer,我怀疑这与此有关

将大部分时间花在旨在发布 GIL 的外部库中(如 NumPy)

这是否意味着 CPU 绑定任务的基于线程的并发实际上是可能的,前提是线程在“旨在释放 GIL”的一些专门设计的外部库中执行 CPU 绑定任务?

【问题讨论】:

  • 用 C 编写的库可以释放 GIL,如果他们不需要它来做任何事情。

标签: python python-3.x multithreading gil


【解决方案1】:

是的,没错。由于 GIL 保护 Python 解释器状态,如果库有大量工作要做,不涉及访问 Python 变量或调用 Python 函数,它可以释放锁。 NumPy is one such library 可以经常这样做。

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多