使用concurrent.futures模块启动进程

concurrent.futures 模块的文档
(https://docs.python.org/3/library/concurrent.futures.html)副标题
是“Launching parallel tasks”(执行并行任务)。这个模块实现的是真正
的并行计算,因为它使用 ProcessPoolExecutor 类把工作分配给多个
Python 进程处理。因此,如果需要做 CPU 密集型处理,使用这个模块
能绕开 GIL,利用所有可用的 CPU 核心。

ProcessPoolExecutor 和 ThreadPoolExecutor 类都实现了通用的
Executor 接口,因此使用 concurrent.futures 模块能特别轻松地把
基于线程的方案转成基于进程的方案。

下载国旗的示例或其他 I/O 密集型作业使用 ProcessPoolExecutor 类
得不到任何好处。这一点易于验证,只需把示例 17-3 中下面这几行:

def download_many(cc_list):workers = min(MAX_WORKERS, len(cc_list))with futures.ThreadPoolExecutor(workers) as executor:

改成:

def download_many(cc_list):with futures.ProcessPoolExecutor() as executor:

对简单的用途来说,这两个实现 Executor 接口的类唯一值得注意的区
别是,ThreadPoolExecutor.__init__ 方法需要 max_workers 参
数,指定线程池中线程的数量。在 ProcessPoolExecutor 类中,那个
参数是可选的,而且大多数情况下不使用——默认值是
os.cpu_count() 函数返回的 CPU 数量。这样处理说得通,因为对
CPU 密集型的处理来说,不可能要求使用超过 CPU 数量的职程。而对
I/O 密集型处理来说,可以在一个 ThreadPoolExecutor 实例中使用 10个、100 个或 1000 个线程;最佳线程数取决于做的是什么事,以及可
用内存有多少,因此要仔细测试才能找到最佳的线程数。

经过几次测试,我发现使用 ProcessPoolExecutor 实例下载 20 面国
旗的时间增加到了 1.8 秒,而原来使用 ThreadPoolExecutor 的版本是
1.4 秒。主要原因可能是,我的电脑用的是四核 CPU,因此限制只能有
4 个并发下载,而使用线程池的版本有 20 个工作的线程。

ProcessPoolExecutor 的价值体现在 CPU 密集型作业上。我用两个
CPU 密集型脚本做了一些性能测试。

arcfour_futures.py
这个脚本(代码清单参见示例 A-7)纯粹使用 Python 实现 RC4 算
法。我加密并解密了 12 个字节数组,大小从 149KB 到 384KB 不等。

sha_futures.py
这个脚本(代码清单参见示例 A-9)使用标准库中的 hashlib 模块
(使用 OpenSSL 库实现)实现 SHA-256 算法。我计算了 12 个 1MB 字
节数组的 SHA-256 散列值。

这两个脚本除了显示汇总结果之外,没有使用 I/O。构建和处理数据的
过程都在内存中完成,因此 I/O 对执行时间没有影响。

我运行了 64 次 RC4 示例,48 次 SHA 示例,平均时间如表 17-1 所示。
统计的时间中包含派生工作进程的时间。

表17-1:在配有Intel Core i7 2.7 GHz四核CPU的设备中,使用Python
3.4运行RC4和SHA示例,分别使用1~4个职程得到的时间和提速倍数可以看出,对加密算法来说,使用 ProcessPoolExecutor 类派生 4 个
工作的进程后(如果有 4 个 CPU 核心的话),性能可以提高两倍。

对那个纯粹使用 Python 实现的 RC4 示例来说,如果使用 PyPy 和 4 个职
程,与使用 CPython 和 4 个职程相比,速度能提高 3.8 倍。以表 17-1 中
使用 CPython 和一个职程的运行时间为基准,速度提升了 7.8 倍。

如果使用 Python 处理 CPU 密集型工作,应该试试
PyPy(http://pypy.org)。使用 PyPy 运行 arcfour_futures.py 脚本,速
度快了 3.8~5.1 倍;具体的倍数由职程的数量决定。我测试时使用
的是 PyPy 2.4.0,这一版与 Python 3.2.5 兼容,因此标准库中有
concurrent.futures 模块。

下面通过一个演示程序来研究线程池的行为。这个程序会创建一个包含
3 个职程的线程池,运行 5 个可调用的对象,输出带有时间戳的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92104.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92104.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92104.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统全面】Linux内核原理——基础知识介绍

理解内核:内核原理 计算机系统的软件分层 不同于单片机中使用代码直接与硬件交互,对于这种方式的缺点深有: (1)复杂度高,调用难度高,需要深入理解硬件的工作原理和细节。 (2&#xf…

Oracle自治事务——从问题到实践的深度解析

一、引言:当“关键操作”遇上主事务的“生死绑定”​先问大家一个问题:假设你在开发一个用户管理系统,核心功能是“用户注册”,同时需要记录“操作日志”。某天,用户提交注册信息时,数据库突然因磁盘空间不…

广播(Broadcast)和组播(Multicast)对比

概述 广播(Broadcast)和组播(Multicast)是计算机网络中两种重要的一对多通信方式,用于高效地将数据同时分发给多个接收者,它们的核心区别在于目标接收者的范围和控制精度,基于业务对效率、规模和…

在 HTTP GET 请求中传递参数有两种标准方式

方法 1:URL 查询参数(Query Parameters)格式:?参数名值&参数名2值2示例请求http://localhost:8080/hello?name张三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷键

适用于mac的快捷键 适用于windows和linux的快捷键 参考资料: https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html

前端包管理工具深度对比:npm、yarn、pnpm 全方位解析

前言:为什么我们需要包管理工具? 在现代前端开发中,模块化已成为标配。一个中型项目可能依赖数百个第三方包,手动管理这些依赖几乎是不可能的任务。包管理工具应运而生,它们不仅解决了依赖安装问题,还提供了…

调试Claude code的正确姿势

随着kimi k2的发布,Claude code的使用频率愈发的频繁,在发现moonshot官方提供了调试工具之后,我对claude code的交互过程愈发好奇。 moonpalace的安装 官方moonpalace仓库地址 go语言编写,可以直接下载二进制二进制文件&#x…

【常见分布及其特征(5)】连续型随机变量-连续均匀分布

概率密度函数(PDF)与概率质量函数(PMF)说明 基本概念区分 对于连续型随机变量,通常使用 概率密度函数 (Probability Density Function, PDF) 进行描述;这与离散型随机变量使用的 概率质量函数 (Probabili…

FAN-UNET:用于生物医学图像分割增强模型

目录 一、论文结构概述 二、创新点详解 三、创新点结构与原理 (1)Vision-FAN Block:全局与周期特征的融合引擎 (2)FANLayer2D:周期性建模的核心 四、代码复现思路 五、仿真结果分析 (1&…

基于SpringBoot的篮球运动员体测数据分析及训练管理系统论文

第1章 绪论 1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行业,尤其是规模较大的企业和学校等…

矩阵算法题

矩阵算法题1、矩阵置零2、螺旋矩阵3、旋转图像4、搜索二维矩阵1、矩阵置零 解题思路:这道题核心是要确定哪些行和哪些列要置零。所以定义两个数组,一个记录要置零的行,一个记录要置零的列。遍历整个矩阵,如果当前位置是0的话&…

Spring底层(二)Spring IOC容器加载流程原理

一、怎么理解SpringIoc IOC:Inversion Of Control,即控制反转,是一种设计思想。之前对象又程序员自己new自己创建,现在Spring注入给我们,这样的创建权力被反转了。 所谓控制就是对象的创建、初始化、销毁。 创建对象…

UDP中的单播,多播,广播

文章目录UDP 简单回顾一、单播(Unicast)定义特点应用举例二、广播(Broadcast)定义特点应用三、多播(Multicast)定义特点应用UDP 单播、广播、多播的对比总结额外说明代码简要示例(C)…

数据库练习3

一、建立product表,操作方式operate表要求:1.定义触发器实现在产品表(product)中每多一个产品,就在操作表(operate)中记录操作方式和时间以及编号记录。注:操作说明:标记执行delete 、insert、 update2.定义触发器实现在产品表(pr…

pycharm和anaconda安装,并配置python虚拟环境

1、pycharm和anaconda安装 PyCharm与Anaconda超详细安装配置教程_anaconda pycharm安装-CSDN博客https://blog.csdn.net/qq_32892383/article/details/116137730 2、pycharm汉化 PyCharm汉化:简单两步搞定!PyCharm怎么设置中文简体,为什么…

EP04:【Python 第一弹】函数编程

一、定义 函数指将一组语句的集合通过一个变量名封装起来,调用这个函数变量名,就可以执行函数。 二、特点 减少重复逻辑代码的编写将程序中的逻辑可以进行扩展维护项目程序的代码更简单 三、创建 def 函数名():逻辑代码1逻辑代码2return 结果 函数名…

linux安装Mysql后添加mysql的用户和密码

在 MySQL 中创建用户并设置密码的完整指南如下: 方法 1:使用 CREATE USER 语句(推荐) -- 创建新用户并设置密码 CREATE USER newuserlocalhost IDENTIFIED BY your_password;-- 授予权限(示例:授予所有数据…

React hooks——memo

一、简介React.memo 是 React 提供的一个高阶组件(Higher-Order Component),用于优化函数组件的渲染性能,它通过浅比较(shallow compare)props 的变化来决定是否重新渲染组件。1.1 基本用法const MyCompone…

leetcode15.三数之和题解:逻辑清晰带你分析

介绍 题源 分析 1.双指针固定一个数 首先明白一点,我们有三个数,我们想使用双指针,那就必须固定一个数。 2.二分 本题还涉及二分,双指针经常和二分结合使用(二分本质就是双指针,仔细思考这思考这句话&…

exports使用 package.json字段控制如何访问你的 npm 包

目录 想象一下你正在开发一个 npm 包…… 术语 什么是exports领域? exports好处 保护内部文件 多格式包 将子路径映射到dist目录 子路径导出 单一入口点 多个入口点 公开软件包文件的子集 有条件出口 设置使用条件 默认条件 句法 针对 Node.js 和浏…