线程池执行器线程数

3

我正在尝试使用futures backport包在Python中使用ThreadPoolExecutor。然而,问题是所有线程都同时执行,因此实际上没有进行任何池化。更具体地说,我得到了10个该函数的线程,而不是5个然后是其他线程。我使用以下代码,请问有问题还是只是backport的实现问题? 谢谢!

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(f, X, y) for t in range(10)]
    for future in as_completed(futures):
        self.trees.append(future.result())

1
你确定吗?你怎么知道并发调用 f 的数量不受 max_workers 限制? - jfs
如果我在Python 2.7中的“f”函数中添加一个打印命令,我会一次性收到10条冗长的消息。 - Yannis Assael
1
f 中添加 time.sleep(5) 以查看并非所有10个函数同时运行。 - jfs
2
@iassael 的输出是有缓冲的,看到两条消息快速打印并不意味着相应的 print 是同时执行的。尝试使用 python -u(无缓冲)来执行,或者更好地,使用任务管理器来验证启动了多少个线程。 - Stefano Sanfilippo
1个回答

0

文档中指出,每个工作线程通常有多个线程:

https://docs.python.org/3/library/concurrent.futures.html

自3.5版本起更改:如果max_workers为None或未给出,则默认为机器上的处理器数量乘以5,假设ThreadPoolExecutor通常用于重叠I/O而不是CPU工作,并且工作人员数量应该高于ProcessPoolExecutor的工作人员数量。

可能它不会默认为5倍增加,因为您使用的版本不是3.5+,或者由于某些内部优化原因。


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