python并行处理任务_Python 并行任务技巧

2023-11-01

Python的并发处理能力臭名昭著。先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念。大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节。这些资料讲的都是虎头蛇尾,到了真正实际使用的部分却草草结束了。

传统例子

在DDG https://duckduckgo.com/ 搜索“Python threading tutorial”关键字,结果基本上却都是相同的类+队列的示例。

标准线程多进程,生产者/消费者示例:

这里是代码截图,如果用其他模式贴出大段代码会很不美观。文本模式点这里 here

Mmm.. 感觉像是java代码

在此我不想印证采用生产者/消费者模式来处理线程/多进程是错误的— 确实没问题。实际上这也是解决很多问题的最佳选择。但是,我却不认为这是日常工作中常用的方式。

问题所在

一开始,你需要一个执行下面操作的铺垫类。接着,你需要创建一个传递对象的队列,并在队列两端实时监听以完成任务。(很有可能需要两个队列互相通信或者存储数据)

Worker越多,问题越大.

下一步,你可能会考虑把这些worker放入一个线程池一边提高Python的处理速度。下面是

IBM tutorial 上关于线程较好的示例代码。这是大家常用到的利用多线程处理web页面的场景

Seriously, Medium. Fix your code support. Code is Here.

感觉效果应该很好,但是看看这些代码!初始化方法、线程跟踪,最糟的是,如果你也和我一样是个容易犯死锁问题的人,这里的join语句就要出错了。这样就开始变得更加复杂了!

到现在为止都做了些什么?基本上没什么。上面的代码都是些基础功能,而且很容易出错。(天啊,我忘了写上在队列对象上调用task_done()方法(我懒得修复这个问题在重新截图)),这真是性价比太低。所幸的是,我们有更好的办法.

引入:Map

Map 是个很酷的小功能,也是简化Python并发代码的关键。对那些不太熟悉Map的来说,它有点类似Lisp.它就是序列化的功能映射功能. e.g.

urls = [', ']

results = map(urllib2.urlopen, urls)

这里调用urlopen方法,并把之前的调用结果全都返回并按顺序存储到一个集合中。这有点类似

results = []

for url in urls:

results.append(urllib2.urlopen(url))

Map能够处理集合按顺序遍历,最终将调用产生的结果保存在一个简单的集合当中。

为什么要提到它?因为在引入需要的包文件后,Map能大大简化并发的复杂度!

支持Map并发的包文件有两个:

Multiprocessing,还有少为人知的但却功能强大的子文件 multiprocessing.dummy. .

Digression这是啥东西?没听说过线程引用叫dummy的多进程包文件。我也是直到最近才知道。它在多进程的说明文档中也只被提到了一句。它的效果也只是让大家直到有这么个东西而已。这可真是营销的失误!

Dummy是一个多进程包的完整拷贝。唯一不同的是,多进程包使用进程,而dummy使用线程(自然也有Python本身的一些限制)。所以一个有的另一个也有。这样在两种模式间切换就十分简单,并且在判断框架调用时使用的是IO还是CPU模式非常有帮助。

准备开始

准备使用带有并发的map功能首先要导入相关包文件:

from multiprocessing import Pool

from multiprocessing.dummy import Pool as ThreadPool

然后初始化:

pool = ThreadPool()

就这么简单一句解决了example2.py中build_worker_pool的功能. 具体来讲,它首先创建一些有效的worker启动它并将其保存在一些变量中以便随时访问。

pool对象需要一些参数,但现在最紧要的就是:进程。它可以限定线程池中worker的数量。如果不填,它将采用系统的内核数作为初值。

一般情况下,如果你进行的是计算密集型多进程任务,内核越多意味着速度越快(当然这是有前提的)。但如果是涉及到网络计算方面,影响的因素就千差万别。所以最好还是能给出合适的线程池大小数。

pool = ThreadPool(4) # Sets the pool size to 4

如果运行的线程很多,频繁的切换线程会十分影响工作效率。所以最好还是能通过调试找出任务调度的时间平衡点。

好的,既然已经建好了线程池对象还有那些简单的并发内容。咱们就来重写一些example2.py中的url opener吧!

看吧!只用4行代码就搞定了!其中三行还是固定写法。使用map方法简单的搞定了之前需要40行代码做的事!为了增加趣味性,我分别统计了不同线程池大小的运行时间。

结果:

效果惊人!看来调试一下确实很有用。当线程池大小超过9以后,在我本机上的运行效果已相差无几。

示例 2:

生成上千张图像的缩略图:

现在咱们看一年计算密集型的任务!我最常遇到的这类问题之一就是大量图像文件夹的处理。

其中一项任务就是创建缩略图。这也是并发中比较成熟的一项功能了。

基础单线程创建过程

作为示例来说稍微有点复杂。但其实就是传一个文件夹目录进来,获取到里面所有的图片,分别创建好缩略图然后保存到各自的目录当中。

在我的电脑上,处理大约6000张图片大约耗时27.9秒.

如果使用并发map处理替代其中的for循环:

只用了5.6 秒!

就改了几行代码速度却能得到如此巨大的提升。最终版本的处理速度还要更快。因为我们将计算密集型与IO密集型任务分派到各自独立的线程和进程当中,这也许会容易造成死锁,但相对于map强劲的功能,通过简单的调试我们最终总能设计出优美、高可靠性的程序。就现在而言,也别无它法。

好了。来感受一下一行代码的并发程序吧。

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

python并行处理任务_Python 并行任务技巧 的相关文章

  • 尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅),笔记

    项目资料 前端资料 https gitee com jch1011 shangpinhui 0415 后台资料 https gitee com jch1011 guigu B站直达 https www bilibili com video
  • 保研之路——上交大电子系直博

    上交大电子系直博 个人情况 高校复试参与情况 上交电子系直博 6 15 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去 除了时间冲突的情况 事实证明 我
  • HITiCS大作业——程序人生

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机科学与技术 学 号 2021112155 班 级 2103103 学 生 谷佳熠 指 导 教 师 刘宏伟 计算机科学与技术学院 2022年11月 摘 要 本篇文章详
  • springboot定时任务详解

    文章目录 一 基于注解 静态 1 添加依赖 2 创建定时任务 3 参数说明 二 基于接口 动态 1 添加依赖 2 添加数据库记录 3 创建定时器 4 启动测试 三 Quartz 1 添加依赖 2 编写任务类 3 编写配置类 4 启动项目 在
  • MySQL数据库的性能优化----(一步一个脚印)

    一 MySQL数据库的优化目标 基本原则 1 优化目标 MySQL数据库是常见的两个瓶颈是CPU和I O的瓶颈 无论是索引优化 还是表结构优化 参数优化 最后都可以归纳到这这两个分类中 1 减少 I O 次数 I O是数据库最容易瓶颈的地方
  • Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function问题解决

    场景 java eclipse 调用问题 java eclipse selenium3 脚本 gt package LoginScript import org openqa selenium import org openqa selen
  • MySQL数据库多列索引详解

    多列索引的概念 多列索引 是指在创建索引时所关联的字段不是一个字段 而是多个字段 虽然可以通过所关联的字段进行查询 但是只有查询条件中使用了所关联字段中的第一个字段 多列索引才会被使用 多列索引的创建 创建表时定义索引 语法 CREATE
  • UE4蓝图:初体验(4)循环

    在C 中循环的关键字有for while do while三种 而在蓝图中 1 For循环 1 在蓝图中 右键输入for loop 获得ForLoop节点 该节点左边的按钮分别是循环计数的初始值和终止值 图中的是指从1 4共循环4次 右边的
  • eclipse中出现红线错误但不提示错误信息解决办法

    eclipse中出现红线报错 但鼠标悬停不提示错误信息 如图例 经过摸索找到了其中的解决方案 这主要与Hovers 的设置相关 通过如下设置修改 Window gt Preferences gt Java gt Editor gt Hove
  • AIX mount RedHat的NFS

    AIX mount RedHat的NFS RedHat 192 168 8 202 AIX 192 168 8 193 在RedHat服务器上设置NFS服务 1 RedHat服务器端的设定NFS都是在 etc exports这个文件中进行设
  • 敏捷运维

    序言 表面上都是自由的 实际上四周围墙 无法跨越 表面上都有很多选择 实际上没得选 成功是一种考验 失败也是 原因能想出来吗 敏捷运维 敏捷开发 在各种压力进行运维 有一定的适合场景 你知道么 风言风语 运维到底根据什么样的节奏走 是快一点
  • 【C语言】- printf 和scanf 函数详解!

    一 printf函数 这是在stdio h中声明的一个函数 因此使用前必须加入 include
  • 时序预测方法总结

    时序预测 本人博客只是平时学习中做的笔记 若文中有错误请大家指出 一 单变量时间预测 1 AR AutoRegression 自回归 自回归基于输入变量的线性组合为输出建模 输入 先前时间步长的值 输出 下一步的值 在时间序列中 鉴于当前和
  • 关于unity3d分享功能之ShareSDK的研究续二

    关于微信分享 前面的博客也是提到了 总有一下问题 有些注意的事项再一次总结一下 注意一 微信需要开发者认证审核通过app 这个时候会有AppID和AppSecret 把这个在脚本ShareSDKDevInfo cs中替换掉 注意在面板中一样
  • 学习QT的意义以及QT平台的安装

    文章目录 前言 一 为什么要学习QT 1 学习Qt的意义 2 Qt的一些应用案例 二 Qt软件的安装 1 Qt的下载 2 具体安装环节 总结 前言 Qt 是一个1991年由Qt Company开发的跨平台C 图形用户界面应用程序开发框架 它
  • 【分析】string中size与length

    结论 没有区别 length是因为沿用C语言的习惯而保留下来的 string类最初只有length 引入STL之后 为了兼容又加入了size 它是作为STL容器的属性存在的 便于符合STL的接口规则 以便用于STL的算法 具体解释 cplu
  • Nreal for Unity SDK 发布安卓参数设置

    Getting Started with NRSDK NRSDK 原文链接 Quickstart for Android NRSDK 1 7 0 documentationhttps nrealsdkdoc readthedocs io e
  • C#学习笔记 文件操作

    获得文件和文件夹信息 NET管理文件和文件夹信息的类有如下几个 Directory和File类是两个静态类 可以静态地获取文件和文件夹的信息而无需实例化对象 这在只对某个文件或者文件夹执行一次操作的时候是很有用的 Path也是一个静态类 为
  • 智慧城市大脑3.0白皮书:城市大协同,未来可持续。

    智慧城市大脑3 0白皮书 城市大协同 未来可持续 一 中国智慧城市建设真实现状 二 中国智慧城市建设的未来 三 智慧城市 脑3 0核 价值 四 2023年 lt 智慧城市解决方案全套 gt 大合集 一 中国智慧城市建设真实现状 中国智慧城市

随机推荐

  • 用了MQ消息中间件后,我开始后悔了...

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 前情回顾 上篇文章 为什么要使用MQ消息中间件 这几个问题必须拿下 给大家讲了讲消息中间件引入系统架构的作用 主要是解决哪些问题的 其比较常见的实践场景是 复杂系
  • 家里Wifi网速突然变慢,一招瞬间提速

    家中网速突然变慢 通常是有人蹭你家的Wifi 不用担心 我教你一招瞬间提速 这个提速妙招的原理很简单 把你家的上网设备全部管起来 没加入的一律不让蹭网 接下来跟我一起实操 查看设备信息 我家的路由器是TP LINK 型号 TL WR886N
  • 门面模式

    类图 实现 HardDrive java package com facade public class HardDrive public byte read long lba int size byte bin null read ret
  • 成功解决:把python 3.9降到python3.8

    conda install python 3 8
  • yaml value中双引号转义

    aaa bbb 由于转义 aaa的值会被输出为bbb 若想输出为 bbb 需要改成 aaa bbb
  • python程序memory error_详解解决Python memory error的问题(四种解决方案)

    昨天在用用Pycharm读取一个200 M的CSV的过程中 竟然出现了Memory Error 简直让我怀疑自己买了个假电脑 毕竟是8G内存i7处理器 一度怀疑自己装了假的内存条 下面说一下几个解题步骤 一般就是用下面这些方法了 按顺序试试
  • STM32使用USART串口调试ULN2003驱动步进电机

    传送门 STM32控制ULN2003驱动步进电机28BYJ 48最基础版 使用串口调试步进电机28BYJ 48获得需要转速 当使用STM32控制ULN2003驱动步进电机28BYJ 48时 步进电机转速变化缓慢 想要得到合适的控制速度 需要
  • 数据库设计六阶段、数据库三范式

    要进行数据库设计首先要遵守范式 进行数据库设计时有六个阶段 下面依次介绍 遵从范式 前三范式 1NF 在关系数据库中 每张表的属性应该具有原子性 解决方法 将多余的属性拆分出来 2NF 在1NF基础上 实体的属性必须完全依赖主键 不能部分依
  • 跟我一起写 Makefile(三)

    跟我一起写 Makefile 三 主要内容 Makefile 总述 一 Makefile里有什么 二 Makefile的文件名 三 引用其它的Makefile 四 环境变量 MAKEFILES 五 make的工作方式 本文来自于CSDN陈皓
  • JavaScript必须熟悉知道的基础整理(一)

    1 我们可以在下列哪个 HTML 元素中放置 Javascript 代码 答
  • C++转换构造函数(隐式构造函数)

    写C 代码的时候 经常需要进行强制类型转换 比如 int a 1 float b float a 但是只限于基本数据类型 如下做法会报错 class Complex int a 1 Complex n Complex a 可以给class定
  • Vue基础入门

    什么是vue Vue是 渐进式框架 vue min js只包含了vue最核心的内容 例如 options api 数据处理 template模板视图的解析等操作 真实项目中我们还会根据需求 导入 vuex 实现公共状态管理 vue rout
  • EasyExcel渲染单个单元格.

    目录 业务逻辑 EasyExcel的pom依赖 EasyExcel的实体类 实现easyexcel的写入拦截器 Service层代码 可能讲解能力较差 但是代码全 不会掐头掐尾 看了很多文章代码只截取局部 导致看下来都是很 业务逻辑 要根据
  • JavaWeb评论功能实现步骤及代码

    文章目录 目录 文章目录 前言 一 分析功能 二 实现功能 1 建评论表 2 Dao层 service层核心代码实现 3 servlet层编写核心代码 4 jsp核心代码 三 展示效果图 总结 前言 评论功能是后端要写常见的功能之一 一般性
  • 计算机等级考试——四级网络工程师考试大纲

    文章目录 四级网络工程师考试大纲 计算机网络考试大纲 基本要求 考试内容 一 网络技术基础 二 局域网技术 三 Internet基础 四 Internet 基本服务 五 新型网络应用 六 网络管理与网络安全 考试方式 操作系统原理考试大纲
  • CSS 的层叠规则

    CSS 的层叠规则 所谓 层叠规则 指的是当网页中的元素发生层叠时的表现规则 在现实世界 凡事都有个先后顺序 凡物都有个论资排辈 例如 食堂排队打饭 讲求先到先得 说到层叠 很多人第一反应就是 z index 属性 人如其名 z 轴顺序 明
  • 快慢指针求环入口问题:

    1 是否存在环 在寻找环入口之前 我们需要先判断是否存在环 判断的方式有很多 经典的方法就是快慢指针 所谓快慢指针 就是用两个指针 一个每次只移动一步 一个每次移动两步 移动块的指针我们称之为快指针 类似 斥候 用于探路 如果快指针到达了空
  • 【ID3 C4.5 决策树】基于QT/C++实现 可处理连续训练集 可视化图像界面

    一 序言 学校工程实践2的题目 基于QT4 8 2以上的版本开发完成 顺手挂在CSDN上 该软件可以选择ID3决策树和C4 5决策树 训练集要求是xlsx格式 读入采用多线程 只做了构造 演示 生成 测试决策树部分 背景花里胡哨的图片可以自
  • Qt Installer Framework应用总结

    Qt Installer Framework应用总结 官网文档位置 https doc qt io qtinstallerframework ifw overview html 本文主要是讲解配置文件的区别以及脚本的使用和一些概念的理解 基
  • python并行处理任务_Python 并行任务技巧

    Python的并发处理能力臭名昭著 先撇开线程以及GIL方面的问题不说 我觉得多线程问题的根源不在技术上而在于理念 大部分关于Pyhon线程和多进程的资料虽然都很不错 但却过于细节 这些资料讲的都是虎头蛇尾 到了真正实际使用的部分却草草结束