为什么 ThreadPoolExecutor 的默认 max_workers 是根据 CPU 数量决定的?

Lon*_*ner 7 python cpu performance multithreading gil

的文档concurrent.futures.ThreadPoolExecutor说:

改变在3.5版本中:如果max_workersNone或者没有给出,将默认为机器上的处理器,乘以数量5,假设的ThreadPoolExecutor通常用于重叠I / O,而不是CPU的工作,工人的数量应该更高比ProcessPoolExecutor的工人数量。

我想了解为什么默认max_workers值取决于 CPU 的数量。不管我有多少 CPU,在任何时间点都只能运行一个 Python 线程。

让我们假设每个线程都是 I/O 密集型的,它只有 10% 的时间在 CPU 上,90% 的时间在等待 I/O。然后让我们假设我们有 2 个 CPU。我们只能运行 10 个线程来使用 100% 的 CPU。我们不能再使用 CPU,因为在任何时间点都只有一个线程在运行。即使有 4 个 CPU,也是如此。

那么为什么默认是max_workers根据 CPU 数量来决定的呢?

use*_*ica 6

检查处理器数量比检查程序的 I/O 限制要容易得多,尤其是在线程池启动时,当您的程序还没有真正开始工作时。没有什么默认值更好的了。

此外,添加默认值是一个非常省力讨论较少的更改。(以前,没有默认值。)尝试变得花哨会是更多的工作。

也就是说,变得更狂热可能会有所回报。也许是某种根据负载调整线程数的动态系统,因此您不必在信息最少的时候决定计数。不过,除非有人写,否则它不会发生。

  • @LoneLearner:这并不比他们选择的好。 (3认同)