并发性与Python中的多重处理3

Python 3.2引入了Concurrent Futures ,它似乎是旧的线程和多处理模块的一些高级组合。

与以前的多处理模块相比,使用CPU绑定任务的优点和缺点是什么?

这篇文章build议他们更容易处理 – 是这样吗?

我不会把concurrent.futures称为更“高级” – 这是一个更简单的接口,无论你使用multithreading还是多进程作为基本的并行化噱头,它的工作方式都是一样的。

所以,就像几乎所有的“简单界面”的实例一样,涉及到很多相同的折衷:它有一个较浅的学习曲线,很大程度上是因为学习的可用性太less; 但是,因为它提供了更less的选项,它最终可能会让更多的接口不能使用。

就CPU限制的任务而言,这样做的意义也不足以说明很有意义。 对于CPython下的CPU绑定任务,您需要多个进程而不是多个线程才有机会获得加速。 但是,你得到的加速有多less(取决于)你的硬件细节,你的操作系统,特别是你的特定任务需要多less进程间通信。 所有的进程间并行化噱头都依赖于相同的操作系统原语 – 用来获取这些原语的高级API不是底线速度的主要因素。

编辑:例如

以下是您引用的文章中显示的最终代码,但是我添加了使其工作所需的导入语句:

 from concurrent.futures import ProcessPoolExecutor def pool_factorizer_map(nums, nprocs): # Let the executor divide the work among processes by using 'map'. with ProcessPoolExecutor(max_workers=nprocs) as executor: return {num:factors for num, factors in zip(nums, executor.map(factorize_naive, nums))} 

这是使用multiprocessing完全相同的东西:

 import multiprocessing as mp def mp_factorizer_map(nums, nprocs): with mp.Pool(nprocs) as pool: return {num:factors for num, factors in zip(nums, pool.map(factorize_naive, nums))} 

请注意,在Python 3.3中添加了使用multiprocessing.Pool对象作为上下文pipe理器的function。

哪一个更容易处理? 大声笑;-)他们本质上是相同的。

一个区别是, Pool支持许多不同的做事方式,你可能不知道有多容易,直到你爬到学习曲线上。

再次,所有这些不同的方式都是一个优点和一个弱点。 他们是一种力量,因为在某些情况下可能需要灵活性。 他们是一个弱点,因为“最好只有一个明显的做法”。 从长远来看,一个完全(如果可能的话) concurrent.futures项目可能会更容易维护,因为它可以使用简约API的缺乏新颖性。