Python 3 中的 Concurrent.futures 与多重处理

2023-11-21

Python 3.2 推出并发期货,这似乎是旧线程的一些高级组合多重处理模块。

与旧的多处理模块相比,将其用于 CPU 密集型任务有哪些优点和缺点?

本文表明他们更容易合作 - 是这样吗?


我不会打电话concurrent.futures更“先进”——这是一个simpler无论您使用多线程还是多进程作为底层并行化技巧,接口的工作原理都非常相同。

因此,就像几乎所有“更简单的界面”实例一样,涉及很多相同的权衡:它的学习曲线更浅,很大程度上只是因为可用的东西少得多to学习;但是,由于它提供的选项较少,因此最终可能会让您感到沮丧,而更丰富的界面则不会。

就 CPU 密集型任务而言,这还不够明确,没有多大意义。对于 CPython 下的 CPU 密集型任务,您需要多个进程而不是多个线程才能获得加速。但是,您获得多少加速(如果有)取决于您的硬件、操作系统的详细信息,尤其是您的特定任务需要多少进程间通信。在幕后,所有进程间并行化技巧都依赖于相同的操作系统原语 - 用于获取这些原语的高级 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.PoolPython 3.3 中添加了对象作为上下文管理器。

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

一个区别是Pool支持多种不同的做事方式,您可能没有意识到它有多么简单can直到你在学习曲线上取得了很大的进步。

同样,所有这些不同的方式既是优点也是缺点。它们是一种优势,因为在某些情况下可能需要灵活性。它们是一个弱点,因为“最好只有一种明显的方法来做到这一点”。一个项目专门(如果可能的话)坚持concurrent.futures从长远来看,它可能会更容易维护,因为它的最小 API 的使用方式缺乏无端的新颖性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 中的 Concurrent.futures 与多重处理 的相关文章

随机推荐

  • 如何强制 Google 重新获取 .well-known/assetlinks.json 以修复我的 Android App Link 实现

    我已经成功地使用 我的本地 APK 实现了 Android 应用程序链接 并且它有效 当我在 Google Play 商店中发布相同的 APK 时 我发现我需要使用 Google 提供的指纹更改 well known assetlinks
  • UIView 上的圆角[重复]

    这个问题在这里已经有答案了 我对如何圆角感到困惑 我见过10 个其他帖子他们都没有帮助过我 我这样做正确吗 import QuartzCore QuartzCore h in my ViewController h void viewDid
  • 使用 jQuery 将 XML 转换为 javascript 数组

    我是 XML 和 AJAX 的新手 也是 Javascript 和 jQuery 的新手 除其他工作职责外 我还设计我们的网站 截止日期已经临近 我能想到的做好这个项目的唯一方法就是使用 AJAX 我有一份充满 XML 对象的文档 例如下面
  • 如何删除MySQL表中的重复项?

    我需要DELETE指定 sid 的重复行MySQL table 我如何使用 SQL 查询来做到这一点 DELETE DUPLICATED TITLES FROM table WHERE SID 1 类似这样的事情 但我不知道该怎么做 这会就
  • 作曲家包测试引导程序

    我已经编写了一个包 作为开发过程的一部分 我想对其运行单元测试 这基本上意味着我需要一个引导文件来为我的包注册自动加载器 我看到的任何包都没有特定的引导文件 因此我不太了解开发人员如何测试他们自己的包 这是我的目录结构 src Compan
  • 如何在 PHP 中创建指定数量且全部等于指定数字的随机值?

    例如 假设我输入 10 作为值的数量 输入 10000 作为总金额 该脚本需要随机化 10 个不同的数字 全部等于 10000 不多也不少 但它也需要是动态的 例如 有时我可能会输入 5 或 6 甚至 99 作为值的数量 并输入任何数字 最
  • 如何在 Windows 上从 ffmpeg 获取实时视频帧和时间戳到 python

    寻找替代方案 因为 OpenCV 不会提供时间戳live相机流 在 Windows 上 这是我的计算机视觉算法所必需的 我找到了 ffmpeg 和这篇优秀的文章https zulko github io blog 2013 09 27 re
  • RequestDispatcher.forward() 与 HttpServletResponse.sendRedirect()

    之间有什么概念区别forward and sendRedirect 在 Web 开发领域 术语 重定向 是指向客户端发送一个空的 HTTP 响应 其中仅包含一个Location标头包含客户端必须向其发送全新 GET 请求的新 URL 所以基
  • (function (classes, fdef, mtable) 中的错误:无法找到签名“spec_tbl_df”的函数“select”的继承方法

    我的项目中出现此错误代码 奇怪的是 我今天早些时候使用的这段代码运行得很好 然而 由于我安装了 R 的更新 我现在在运行它时收到此消息 df1 lt df gt select Month Longitude Latitude Type Er
  • Gradle 构建期间序言中不允许出现内容

    我尝试了不同的方法 但问题没有解决 我什至重新安装了 android studio 但仍然遇到同样的问题 Fatal Error annotations 26 1 1 pom 2 1 Content is not allowed in pr
  • Vue - 深度观察对象数组并计算变化?

    我有一个名为people包含如下对象 Before id 0 name Bob age 27 id 1 name Frank age 32 id 2 name Joe age 38 它可以改变 After id 0 name Bob age
  • 此双重检查锁定修复有什么问题?

    所以我现在看到很多文章声称在 C 上双重检查锁定 通常用于防止多个线程尝试初始化延迟创建的单例 已被破坏 正常的双重检查锁定代码如下所示 class singleton private singleton private construct
  • numpy 中 itertools.combinations 的 N 维版本

    我想实施itertools combinations对于 numpy 基于这次讨论 我有一个适用于一维输入的函数 def combs a r Return successive r length combinations of elemen
  • 有没有一种简单的方法可以在 Visual Studio 中编写 UTF-8 八位字节?

    我有一个问题 我需要在 C 源代码中的标准 char 类型上使用 UTF 8 编码的字符串 如下所示 char twochars xe6 x97 xa5 xd1 x88 通常 如果我想编写 UTF 8 字符 我需要使用如上所述的八位字节 V
  • 非规范化数据

    我使用以下 R 代码将数据标准化为最小值和最大值 normalize lt function x return x min x max x min x mydata lt as data frame lapply mydata normal
  • .NET 类及其源代码

    当我编写 C 或任何 NET 程序 时 我使用方法和类 我使用的大部分代码都是从 NET 类调用方法 是否可以 纯粹出于好奇 查看这些类的实际源代码 我知道 MSDN 有完整的类 它们的属性和方法的列表 但我想看看代码 是的 浏览 NET框
  • Django 按点赞数最高的顺序排序

    我正在尝试创建一个页面 人们可以在其中看到评分最高的文章 但存在一个问题 当我过滤另一用户也喜欢的文章的点赞数时 它会创建已投票文章的副本 我想要的是按照点赞数最高的顺序对博客的文章进行排序 模型 py class Article mode
  • 使用 Realm.io 存储货币值

    我开始在我正在编写的 Android 应用程序中使用 Realm io 在我的一个数据对象中 我需要存储货币值 以前 我在内部将该值存储为 BigDecimal 值 然后在移入和移出数据库时也将其转换为双精度值 我总是被告知 由于处理货币值
  • TCP套接字客户端通过nodejs上的代理

    我需要与 smtp 服务器建立 tcp 套接字连接 是否可以通过nodejs上的代理服务器连接 有可用的 npm 模块吗 我根本找不到任何东西 var net require net var HOST 127 0 0 1 var PORT
  • Python 3 中的 Concurrent.futures 与多重处理

    Python 3 2 推出并发期货 这似乎是旧线程的一些高级组合多重处理模块 与旧的多处理模块相比 将其用于 CPU 密集型任务有哪些优点和缺点 本文表明他们更容易合作 是这样吗 我不会打电话concurrent futures更 先进 这