当前位置: 首页 > 面试题库 >

Python 3中的Concurrent.futures与Multiprocessing

翟卓君
2023-03-14
问题内容

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

与较旧的多处理模块相比,将此功能用于与CPU绑定的任务有什么优点和缺点?

本文建议他们更容易使用-是这样吗?


问题答案:

我不会称其为concurrent.futures“高级”,它是一个 更简单的
接口,其工作原理几乎相同,无论您使用多个线程还是多个进程作为基础并行化ization头。

所以,像“简单的界面”的几乎所有情况下,大同小异的取舍都参与:它有一个浅的学习曲线,这在很大程度上只是因为有可用的要少得多 ,以 学习;
但是,由于它提供的选项较少,因此最终可能使您无法使用更丰富的界面而感到沮丧。

就与CPU绑定的任务而言,这还不够具体,以至于说不出什么意义。对于CPython下与CPU绑定的任务,您需要多个进程而不是多个线程才能获得加速的机会。但是,获得多少加速(如果有)取决于硬件,操作系统的详细信息,尤其取决于特定任务需要多少进程间通信。在幕后,所有进程间并行化头都依赖于相同的OS原语-
用于获得这些原语的高级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))}

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

至于哪个更易于使用,它们本质上是相同的。

一个区别是Pool支持这样的事情,你可能不知道是多么容易的许多不同的方式 可以 是直到你攀上了学习曲线相当一路上扬。

同样,所有这些不同的方式都是优点和缺点。它们是优势,因为在某些情况下可能需要灵活性。它们之所以成为弱点,是因为“最好只有一种明显的方式”。concurrent.futures从长远来看,专案(如果可能)坚持下去的项目可能会更容易维护,这是因为在如何使用其最小的API方面缺乏免费的新颖性。



 类似资料:
  • 使用map()和一个基本的线程池 # futures_thread_pool_map.py from concurrent import futures import threading import time def task(n): print('{}: sleeping {}'.format( threading.current_thread().name,

  • 本文向大家介绍Python3中关于cookie的创建与保存,包括了Python3中关于cookie的创建与保存的使用技巧和注意事项,需要的朋友参考一下 1.cookie的作用 cookie 是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据,就像有些网站上的一些数据是需要登录后才能看得到,那么想抓取某个页面内容,就需要用到cookie来模拟登陆了。 在用cookie模

  • 问题内容: 我正在使用Python 3.2.1,但无法导入模块。我使用 和它的作品,但我不能使用它的是这样的: 我收到以下错误: 当我写的import StringIO时候说 问题答案: 当我写导入StringIO时,它说没有这样的模块。 从Python 3.0的新功能开始: 在和模块都没有了。而是导入io 模块,分别将或用于文本和数据。 。 修复一些Python 2代码以使其在中工作的可能有用的

  • 当我编写时,它说

  • 本文向大家介绍python2 与python3的print区别小结,包括了python2 与python3的print区别小结的使用技巧和注意事项,需要的朋友参考一下 在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构

  • 本文向大家介绍解析Python3中的Import,包括了解析Python3中的Import的使用技巧和注意事项,需要的朋友参考一下 Python import的搜索路径 import的搜索路径为: 搜索「内置模块」(built-in module) 搜索 sys.path 中的路径 而sys.path在初始化时,又会按照顺序添加以下路径: foo.py 所在目录(如果是软链接,那么是真正的 foo