范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

这么一搞,再也不怕线程打架了

  作者:李晓飞
  来源:Python 技术
  假如我们需要处理一个文本文件,里面有 100万行数据,需要对每条数据做处理,比如将每行数据的数字做一个运算,放入到另一个文件里。
  最简单的办法就是打开文件,逐行读取,每读取一行,对这一行做下处理,添加到目标文件中,再回来读取下一行。
  这就是线性处理方式,假如处理一行数据需要 0.1 秒,那么用线性处理方式就需要:
  10万秒,即大概 28个小时
  显然对我们来说,这个时间有点长,有没用办法缩短呢?
  当然有办法,那就是用  多线程  处理!
  为什么呢?是因为多线程是提高效率,实现更有效程序的必然状态。
  比如,需要处理大量的数据,需要响应多样的请求,需要与慢速的处理过程交互等等,都需要用到线程编程。
  但是,线程这个概念不太好理解,用起来也总是不方便,而且容易出错,一方面是因为,我们的思路是线性的,另一方面是多线程本身有很多需要掌握的概念,学习理解难度比较高。
  今天我将分享一下我在工作中是如何利用多线程技术,提速增效的。
  对于前面那个例子,可以将原来的一个处理流程,分解为多个,例如之前的处理可以分解为:
  读取行、做运算、存文件 三个自流程。
  这样的话,相当于将只能一个人做的工作,可以让更多的人来做,从而形成类似的流水线效应,如图所示:
  流水线
  这是一张 CPU 处理指令的流水线示意图,可以看到在 t3 和 t4 的时间,四个工作在同时进行。
  那么用多线程,就可以使我们的三个工作出现同时运行的状态,提升效率,比如先读取一行,然后再处理数据的同时,读取下一行,如此往复。
  是不是感觉很好?
  先别着急,首先需要解决一个问题 ——
  如何避免重复读和跳读
  重复读指的是,一个以上线程读取到了同一条数据;
  跳读指的是,有些数据行没有任何线程处理。
  这里介绍一个帮助我处理了很多多线程问题的方法,一个数据源类。  多线程数据源类
  数据源类,就是将数据集中管理,然后以线程安全的方式为多线程程序提供数据。
  注意  :并非最佳方法,但很实用
  废话不多说,直接看代码:  import threading  class DataSource:     def __init__(self, dataFileName, startLine=0, maxcount=None):         self.dataFileName = dataFileName         self.startLine = startLine  # 第一行行号为1         self.line_index = startLine # 当前读取位置         self.maxcount = maxcount  # 读取最大行数         self.lock = threading.RLock() # 同步锁                  self.__data__ = open(self.dataFileName, "r", encoding= "utf-8")         for i in range(self.startLine):             l = self.__data__.readline()      def getLine(self):         self.lock.acquire()         try:             if self.maxcount is None or self.line_index < (self.startLine + self.maxcount):                 line = self.__data__.readline()                 if line:                     self.line_index += 1                     return True, line                 else:                     return False, None             else:                 return False, None          except Exception as e:             return False, "处理出错:" + e.args         finally:             self.lock.release()          def __del__(self):         if not self.__data__.closed:             self.__data__.close()             print("关闭数据源:", self.dataFileName) __init__  初始化方法,接受 3 个参数lock  属性是一个同步锁,以便在多线程读取不出现冲突 dataFileName  是数据文件路径 startLine  开始读取行,对于大文件需要分配处理时特别有用, maxcount  读取最大行数,通过和 startLine  配合可以读取指定部分的数据,默认为全部读取 getLine  方法,每次调用会返回一个元组,包含状态和得到的,数据 __del__  方法会在对象销毁时调用,在此记录当前处理位置
  这样就是可以应用在多线程程序中,承担读取待处理记录的任务了。  业务处理
  例如核心处理程序如下:  import time  def process(worker_id, datasource):     count = 0     while True:         status, data = datasource.getLine()         if status:             print(">>> 线程[%d] 获得数据, 正在处理……" % worker_id)             time.sleep(3) # 等待3秒模拟处理过程             print(">>> 线程[%d] 处理数据 完成" % worker_id)             count += 1         else:             break # 退出循环     print(">>> 线程[%d] 结束, 共处理[%d]条数据" % (worker_id, count)) 参数  worker_id  是线程号,用于区分输出消息 参数  datasource  是 DataSource  的实例,作为各线程的共享数据源 count  用于记录当前线程处理的记录数 用一个死循环,驱动反复处理,直到读取没数据可读  组装
  线程组装部分就也很简单:  import threading  def main():     datasource = DataSource("data.txt")      workercount = 10 # 开启的线程数,注意:并非越多越快哦     workers = []     for i in range(workercount):         worker = threading.Thread(target=process, args=(i+1, datasource))         worker.start()         workers.append(worker)          for worker in workers:         worker.join() 先初始化一个  DataSource  workercount  为需要创建的线程数,在实际应用中可以通过配置或者参数提供,另外不是线程越多越好,一般设置为CPU核心数的两倍即可 threading.Thread  是线程类,可以实例化一个线程,target  参数是线程处理方法,这里就是前面定义的 process  方法,args  为提供给处理方法的参数 线程的  start  方法是启动线程,因为创建不等于启动,start  是个异步方法,调用会瞬间完成 join  方法是等待线程处理完成,是同步方法,只有线程真正处理完成才会结束 扩展
  通过这样的方式,帮我处理了很多实际的业务,比如爬取关键字信息,合并数据等等。
  如果处理的数据不是文本文件,只要修改一下  DataSource  的 getLine 实现就可以了,比如数据源来自数据库等。
  另外,上面的  DataSource  并非最优的,只是起到了规范读取接口,防止数据误读的作用,完全谈不上性能最优。
  那么如何实现更优呢,这里提供一个思路就是,使用 生产者消费者模型 ,利用 队列 ,以及 预读取  技术来实现更优的数据源类。
  例如, DataSource  中,是逐行读取的,可以采用预读取,即提前读取一些数据,当线程需要数据时,先给出预读取的,等预读取的数据消费到一定量时,再异步读取一部分。
  这样的好处是,各个线程不必等待  IO  时间(简单理解为从文件或者网络读取的等待时间)。
  如何实现呢,可以了解一下队列( queue )的概念,Python 中提供了两种队列,同步队列 queue[1]  和 队列集[2] 。
  想想具体应该怎么做呢?欢迎在留言区写下你的方法和建议。  总结
  今天分享了一个在实际工作中用到的,多线程处理数据的例子,例子虽然简单,但很实用,已经帮助我处理了很多重要的工作。
  谈一些感悟,Python 的应用并不仅限于数据分析、AI 领域等热门领域,更多的可以应用在于处理日常生活工作中,比如处理数据,代替手工操作,简单运算等。
  我们知道,学会一个东西最好的方式是使用,对于 Python 技能来说,也是一样的,多在日常工作中用,多去解决实际问题,不用卯足了劲儿,憋个大招。
  祝你在 Python 大道上越走越顺,比心!

准备买OPPOReno6标准版给妈妈用,配置怎样?能用几年?题主可以放心的买,这回的OPPOReno6标准版在配置上诚意十足,而且还是支持36个月流畅不卡顿,使用寿命的问题也不用担心在OPPO官方商城的详情页可以看到,OPPOReno6标准为什飞机在空中转弯侧倾飞行时,杯子里的水还是跟杯口呈水平状态?因为离心力,同时客机也达不到机翼垂直地面这样的侧倾角度,而战斗机通常转弯较快,离心力更大,垂直地面也无妨。下图可以看出,客机与地面垂直是不现实的,当战斗机盘旋的时候,要达到78。5支付宝网商贷借款20万,创业失败无力偿还怎么办?有什么后果?马爸爸对钱没兴趣,没事。有10000个人不还是自己的错,如果有100万人不还就不是自己的错。罚点利息,上征信,对你以后的人生有影响。先不说还不还的上的问题,先保证自己温饱解决了再考光芒都留给了Note9系列,网友Note10系列会没压力?一直以来,竞争不仅仅局限于不同品牌,自家品牌旗下的产品也免不了对比。就在今天,红米官方的官宣了redmiNote系列全球销量突破2亿台出货数据,本以为这应该是除了520最好听的数字为什么食物链中越上级的生物,繁殖能力越弱?动物种群数量,并不需要通过基因控制,通过饥饿来控制就行,食物链顶级的生物并非繁殖能力弱,只是养不活过多的幼崽。即便是以群体合作来捕猎的动物,纯粹依靠自己的体能来捕杀动物的数量也是相为什么现在很多程序员都喜欢用Mac作为主力开发了?最主要原因是,现在年轻一代,不管有没有钱但是一定得享受,用Mac主要部分还是装逼。要说好用windows也很好用,别给我说什么unix系统,链接服务器方便,终端好用和linux命令华为智慧屏新品通过HDRVivid和AudioVivid双认证,打造音画天花板近日,华为官宣将于4月28日举行发布会,带来华为智慧屏新品。有媒体曝光,华为持有大量HDRVivid和AudioVivid相关专利,而且华为智慧屏新品通过了HDRVivid和Aud社保都已经5G联网了社保已经全国统筹啦那全国统筹是什么意思呢?其实就是社保全国联网了你在全国的每个地方交的社保都可以查到以后再也不需要跨省转移社保交社保再也不是一件麻烦事儿了全国统筹对每个人影响都很大今日热点个人养老金制度出炉小红书裁员俞敏洪反思新东方意义1王者荣耀供应商回应抄袭网易手游正在紧急调查,会尽快作出说明4月21日消息,针对网易旗下手游时空中的绘旅人在社交平台发文喊话腾讯旗下手游王者荣耀抄袭其原创设计图的情况,王者荣耀供应新能源充电行业首个居住社区充电设施建设标准发布如何有效解决社区建桩难充电难,已经成为了摆在新能源车主面前的老大难问题。为了规范社区充电桩建设标准,打通新能源车主充电的最后一公里,4月21日,中国标准化协会城镇基础设施分会正式审华为PixLabB5打印机体验助力中小型企业,高速稳定越用越省2022年4月20日,华为召开了华为终端商用产品春季发布会。这次发布会对于华为来说意义重大,华为消费者业务改名为终端业务,并且发力商用办公领域,打造出了商用产品线。和其他商用设备相
笔记本电脑可以换cpu吗?笔记本电脑可以换cpu吗?这个问题提的很好,很有普及知识的意义,但是这个问题回答起来也要看时间段。就目前2019年的电脑市场行情来看,笔记本CPU能不能换,已经变成了2个阵营,那就想买12mini的看看就知道该不该买了iPhone12mini是推荐给小屏党使用的手机。对于续航不焦虑和单卡不在乎的同学们那就没事了。iPhone12mini采用5。4英寸(对角线)OLED全面屏,机身为131。564苹果手机怎样跟电脑互传文件?教你1招,几G的文件也能轻松传输苹果手机怎样跟电脑互传文件?可能很多人首先想到的是通过itunes来实现,或者通过QQ微信来进行传输文件。其实,还有一个更加简单好用的方法,不仅可以传输几M几十M的小文件,而且还能iPhone手机如何买虎年有娱iPhone购买手册一册在手购机不愁Hello果粉们。iPhone如何选购文章终于完成啦趁着年后大家还能置办年货过年哈哈。!!言归正传今天分享一下如何选购合适的手机很多小伙情人节快到了,筹划下买点什么呢?这四款数码产品值得考虑虽然现在刚到2月初,但不得不说,情人节的脚步已经临近了,如果初七开始行动,可能会手忙脚乱一些,毕竟物流速度恢复还要一段时间,所以现在考虑,也不失为一个好策略。那么今年情人节,筹划买发布会前先睹为快!三星S22系列最全配置信息曝光近日,三星官方正式宣布了三星S22系列全球发布会将在2月9日举行,而随着日期的临近,关于三星S22系列的相关爆料也逐渐多了起来,下面小编就整理了三星S22系列的三款机型S22S22新年最值得入手的3款小尺寸旗舰手机,性能小钢炮不少朋友追求小尺寸的握持感,也有不少女生选择小屏手机,毕竟太大的握不住。所以今天快哥整理出三款最强的小屏手机供大家参考,建议先保存收藏,慢慢比较三星GalaxyS21价格3999(新年最适合送给父母的3款手机,大内存大电池,价格还不贵科技的发展,给人带来了不少的便利。随着网络的普及,短视频也越来越火,作为新时代的中老年人,都兴致勃勃地捧起了手机。新的一年到了,也是时候给父母长辈们换上一款新的手机了。那如何给父母中医药循证研究四证方法学体系创建及应用链接在建立产证规范技术体系的基础上,结合中医个体精准诊疗特色内核,融合人工智能机器学习等关键算法,创建了循证目标成就评量中医药单病例随机对照试验设计中医核心证候集医患共建平行病历等2022开年换手机,一定要牢记三不碰原则,让你买到满意的手机很多人买手机都会挑花了眼,确实,现在手机市场琳琅满目,各种手机各种品牌各种价位,那怎么能在众多手机中挑中自己喜欢的手机呢,其实只要谨记这三不碰原则,基本上你看中的手机都可以入手。第999元4K分辨率34英寸带鱼屏实测可以放心买高分辨率带鱼屏对于不少用户来说是不错的选择,因为这样就可以省去买两个屏幕的钱,而达到两个屏幕扩展的效果。不过,高分辨率带鱼屏一般来说都比较昂贵,而便宜的带鱼屏往往分辨率又不高,颗粒