Python多线程最大工作线程数(max_workers)

6
根据ThreadPoolExecutor文档

如果未设置max_workers或将其设置为None,则默认值将为机器上的处理器数量。

如果我没有像这样设置一个值
ThreadPoolExecutor(max_workers=None)

如果我的值非常低(2),会对性能产生负面影响吗?Python是否已经为值为None分配了所有CPU进程,而仅为数字值分配了2个进程?

1个回答

21
首先,您似乎在引用链接中的错误部分文档,应该是进程而不是线程。 concurrent.futures.ThreadPoolExecutor 的文档表示:

从版本3.5开始:如果未指定max_workers或者为None,将默认为机器上的处理器数量乘以5,假设ThreadPoolExecutor通常用于重叠I/O操作而非CPU工作,并且工作线程数应大于ProcessPoolExecutor的工作线程数。


由于您正在使用线程而不是进程,所以假设您的应用程序是I/O绑定而不是CPU绑定,并且您正在使用此方法进行并发性而不是并行性。您使用的线程越多,则可以实现更高的并发性(在一定程度上),但您将获得更少的CPU周期(因为会存在上下文切换)。您必须根据典型工作负载对应用程序进行仪表化,以确定最适合您的内容。对于此问题没有普遍最优解。

我正在使用Python 2.7 - 在这种情况下应该怎么做?我的意思是问,如果我设置限制或不设置限制是否有影响,例如在任何情况下我都需要最大数量的工作线程(例如,我调用4个方法)。 - Dejell
@Dejell 首先,请注意您链接的是Python 3.5文档。无论如何,我的观点是您需要尝试不同的值以查看哪个适合您。无论是您还是Python标准库的作者都无法预测什么对您的情况最有效。如果性能对您很重要,我不会依赖默认的隐含数字。 - Ami Tavory
1
谢谢。什么是“默认隐含数字”?也许我漏掉了什么 - Python是否会为该默认数字“分配”内存,还是只有在我编写execute.submit()时才会分配? - Dejell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接