




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章
多线程Python程序设计01线程概述02使用Python实现多线程03综合案例:基于多线程的爬虫应用04本章回顾01线程概述1.什么是进程进程是操作系统资源分配和调度的基本单位。计算机使用时多个同时运行的软件程序,程序代码存于磁盘,加载到内存由CPU执行,运行中可能与外设交互、产生数据,操作系统将运行程序封装成进程并按调度算法切换执行,可按“Ctrl+Alt+Delete”打开任务管理器查看进程。01线程概述2.什么是线程在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。后来随着计算机行业的发展,程序功能的设计越来越复杂,而某些活动随着时间的推移会被阻塞,此时就想到能否将这些应用程序分解成更细粒度的实体,并且这些细粒度的执行实体可以共享进程的地址空间,所以就出现了线程的概念。线程是操作系统能够进行运算调度的最小单位,可以看做是轻量级的进程,线程之间切换的开销小,所以线程的创建、销毁、调度性能远远优于进程。01线程概述3.进程和线程的区别进程和线程分工明确,进程有主线程,负责分配管理资源,线程负责CPU调度运算,是CPU切换时间片最小单位。一个进程多个线程,线程共享进程堆和方法区资源,各有自己的程序计数器和栈区域。01线程概述方法区:用来存放加载的类、常量等信息。堆:是进程中最大的一块内存空间。栈:用于存储该线程的局部变量(私有的)和栈祯。计数器:一块内存区域,用来记录线程当前要执行的指令地址。关于进程与线程的区别总结如右图所示。多线程相关概念1.什么是多线程多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。举一个生活中的例子,如果你吃完水果再看电视就是单线程,而一边吃水果一边看电视就是多线程。在拥有多核的机器上,使用多线程技术,可以明显提升系统的执行效率。多线程相关概念2.并发与多线程多线程可以实现任务并发执行,并发是指同一个时间段内多个任务同时都在执行,并且都没有执行结束,并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。多线程并发执行过程中需要注意线程安全的问题,即当多个线程同时操作共享变量时,会出现某个线程更新共享变量的值,但是其它线程获取到的是共享变量没有被更新之前的值,这将导致数据不准确,可以使用多线程同步和加锁解决此问题。多线程相关概念3.线程的生命周期当线程被创建并启动以后,它既不是一启动就进入执行状态,也不是一直处于执行状态,其要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态,这5种状态也叫线程的生命周期,如下图所示。多线程相关概念(1)新建状态当使用新建线程的方法建立一个线程后,该线程对象处于新建状态,注意此时线程未被启动。(2)就绪状态当处于新建状态的线程,通过调用开始启动线程方法进入到就绪状态,此时线程已经被启动,具备了运行条件,正在等待被分配CPU资源。简单理解就是处于就绪状态的线程已经做好了运行准备,等获取到CPU资源后就可以被运行。(3)运行状态就绪态线程获CPU资源进入运行态。单CPU时某时刻仅一个线程运行,多CPU时可多线程并行。运行线程按调度策略和优先级调度,不会一直占CPU。运行态线程时间片内正常结束进死亡态,否则回就绪态。多线程相关概念(4)阻塞状态当处于运行状态的线程遇到某些情况就会进入到阻塞状态,如:调用了sleep()方法主动放弃其所占用的处理器资源。等待I/O流的输入输出。等待网络资源。试图获得一个锁对象,但该锁对象正被其它线程所持有。等待某个通知。当引起阻塞的原因消除后,线程就会重新转入到就绪状态。(5)死亡状态线程生命周期的最后一个阶段就是死亡状态,进入死亡状态的原因主要可总结如下:正常运行的线程完成了全部的工作。线程抛出未捕获的异常。线程被强制性终止。需要注意的是主线程死亡,并不意味着所有线程全部死亡。也就是说,主线程的死亡,不会影响子线程继续执行,反之亦然。02使用Python实现多线程Python3的_thread库和threading库支持线程,重点介绍threading库多线程实现。Python的GIL使同一时间仅一个线程能用CPU,其多线程虽不能提高CPU利用率,但能提高程序I/O(磁盘和网络读写)访问速度。使用threading实现多线程1.普通方式实现多线程接下来我们可以先定义2个函数,然后模拟多线程的实现过程,如右图所示。使用threading实现多线程在上面代码中,函数study1()和study2()被称为线程函数,函数内的代码就是线程要执行的内容;在创建Thread类实例的时候,需要将线程函数的函数名传给target参数;线程实例创建完之后,需要使用start()方法启动线程,这时study1()和study2()函数内的代码才会被执行,运行结果如下图所示。使用threading实现多线程从上图中可以看出,多线程程序执行顺序不定。Thread类创建的是子线程,程序默认启动主线程,主线程从程序首行、子线程从线程函数首行执行,子线程启动后有两个线程。线程执行时间由CPU调度定。执行sleep()函数线程阻塞,结束后就绪等待调度,线程函数执行顺序不确定。使用threading实现多线程2.自定义线程自定义线程就是自己定义一个类,继承自threading.Thread类,然后重写其中的run()函数,举例如右图所示。使用threading实现多线程在上述代码中,我们定义了一个MyThread类继承自threading.Thread类,然后重写了构造方法和run()方法。在main()函数中,我们对自定义的线程MyThread进行了实例化,然后使用其start()函数启动线程,启动之后就会运行子线程中的run()函数,运行结果如右图所示。使用threading实现多线程上页代码中的两个线程是同时运行的,其运行结果很混乱,如果我们想让一个先运行,一个后运行,可以使用join()方法实现,其会一直等待对应线程结束后才运行下一个线程,如右图所示使用threading实现多线程从上图中可以看出,其是按照顺序执行的,线程1完成所有工作之后,线程2才开始工作。默认情况下join()函数会一直等待对应线程结束然后进入下一个线程,但是我们也可以通过其timeout参数设置指定时间(单位是秒),如“t.join(timeout=1)”。使用threading实现多线程3.threading.Thread类常用属性和方法上面介绍了实现多线程的两种方式,threading.Thread类中还有一些属性和方法可以帮助我们获取线程的一些信息,如获取线程的名称可以通过属性name和getName(),如右图所示。使用threading实现多线程为了方便大家记忆,现将threading.Thread类的常用属性和方法总结如下表所示。线程锁多线程开发特性:原子性:保证数据一致、解决线程安全问题,操作要么全执行不被打断,要么不执行。可见性:多线程访问同一变量,一个线程修改值,其他线程能马上看到。有序性:程序按代码先后顺序执行线程锁但有时在使用多线程时,会违背其中的特性,接下来我们定义一个制作桌子的线程,然后启动3个线程来工作,如下图所示。线程锁上述代码运行结果从左图中可以看出,需20个桌子,但运行结果序号超20(违背多线程特性),因3线程同时工作,一线程改值其他线程不能及时知晓。可借助线程锁机制,锁制作椅子和打印结果,避免CPU使用权被系统切换线程锁2.线程锁的使用threading模块提供的Lock()函数可以提供线程锁服务,一旦线程获得锁,其他试图获取锁的线程将被阻塞等待。给线程加锁主要分为以下3步:①使用threading.Lock()初始化锁。②使用Lock.acquire()获取锁。③使用Lock.rease()释放锁。线程锁接下来对“做桌子”代码实现加锁服务,如下图所示。线程锁加锁之后的运行结果如右图所示(不会再出现图8-8中超出序号的情况)。案例【案例描述】无论是在工作中还是学习过程中,经常需要对文件或文件夹进行复制,如从朋友那里复制电影、歌曲、小说等;从同事那里复制项目资源等。本案例我们分别使用单线程和多线程进行视频文件夹的复制,并对比其效率。【案例要求】在D盘中有一个文件夹videos,文件夹中是一些视频文件,如右图所示。请分别使用单线程和多线程的方式将其备份到D盘下的videosbak1和videosbak2文件夹下(文件夹已存在),并计算耗时。案例【代码1】以单线程的方式复制文件【代码2】以多线程的方式复制文件案例【运行结果】以单线程和多线程的方式复制文件的运行结果对比如图1所示。从图1中可以看出,以多线程的方式复制文件的运行效率是优于单线程的,说明在进行I/O文件访问时,多线程方案还是能提高程序的执行效率的。这里由于文件比较少,对比结果不是特别明显,如果处理大量文件时对比会更明显。03综合案例项目分析:项目背景:微信、QQ等社交软件兴起,网络聊天成生活一部分,年轻人爱用表情包,其省事便利,能降成本、调氛围、更好表达想法,“斗图”时还考验表情包库存。项目需求:人们希望短时间获海量表情包,常使用网络爬虫,Python类库丰富,是爬虫首选工具,本项目爬取一个表情包网站(下图)。运行程序后,预期效果是电脑中会出现一个文件夹,文件夹中是下载后的表情包,并且表情包以其在网站中的标题命名。03综合案例项目实现思路:爬虫分网页下载、解析、数据保存三阶段,本项目适用。(1)网页下载:分析网页网址变化规律,此网站页码动态拼接在url结尾,主要用6.3.2介绍过的requests库。(2)网页解析:对下载得到的html内容解析,找表情包标题、链接等数据,主要用6.3.2的BeautifulSoup库。(3)数据保存:通过解析获取图片url后,借浏览器request请求获图片二进制内容,用file对象写入保存。此外,本案例还用单线程和多线程爬虫并对比耗时。单线程爬取表情包【核心知识点】①函数定义与调用;②Requests库使用;③BeautifulSoup库使用;④os、random等模块使用。【核心流程】①指定存图文件夹,无则创建;②指定待爬取网页url;③设多个浏览器User-Agent列表,模拟随机选一个获取headers;④用获取的headers和requests库获取html内容;⑤用BeautifulSoup库依html内容获取img标签的标题和图片链接信息;⑥根据图片链接信息获取二进制内容,以标题命名后保存到指定文件夹(循环保存)单线程爬取表情包单线程爬取表情包运行代码之后,发现E盘多了一个名为“bqb”的文件夹,如下图所示。多线程爬取表情包使用多线程实现爬虫的流程与单线程基本类似,只是需要借助threading模块和queue队列模块,关于队列我们以前没有接触过,这里简单介绍一下。1.queue模块介绍在Python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,为了能确保数据的安全性和一致性,就可以使用队列。Python中的queue模块实现了队列,其提供了同步的、线程安全的队列类,包括先入先出队列(Queue)、后入先出队列(LifoQueue)和优先级队列(PriorityQueue)。queue模块的常用方法可总结如下表所示。多线程爬取表情包多线程爬取表情包其中使用get([block[,timeout]])方法从队列中获取任务,主要流程如下:①尝试获取互斥锁。②如果此时队列为空,则wait等待生产者线程添加数据。③get到任务后,会调用self.not_full.notify()通知生产者线程,队列可以添加元素了。④释放互斥锁。使用put(item)向队列中添加任务,主要流程如下:①申请获得互斥锁。②获得后,如果队列未满,则向队列中添加数据,并通知notify其它阻塞的某个线程,唤醒等待获取require互斥锁。③如果队列已满,则会wait等待,最后处理完成后释放互斥锁。多线程爬取表情包2案例实现【核心知识点】①函数的定义与调用。②Requests库的使用。③BeautifulSoup库的使用。④os、random等模块的使用。⑤threading线程模块的使用。⑥queue队列模块的使用。同样是下载3页表情包,单线程耗时186秒,而多线程只需要7秒,效率较单线程高了很多。如右图所示。多线程爬取表情包多线程爬取表情包多线程爬取表情包上述代码的运行结果如下图所示。本章回顾1.【多选】以下关于进程和线程的描述正确的有()。A.进程是操作系统资源分配的基本单位B.线程是CPU调度的最小单位C.每个进程都有独立的内存空间D.同一进程中的线程可以共享内存空间2.【多选】以下关于线程的生命周期描述正确的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年楚雄货运上岗资格证模拟考试
- 罕见病案例解析
- 海内外养老新模式参考
- 2025年银川货运从业资格证网上考核app
- 2025年石嘴山下载货运从业资格证模拟考试题
- 廉政方面存在问题
- 八年级语文下册第一单元比较探究克隆技术的伦理问题教学全国公开课一等奖百校联赛微课赛课特等奖课件
- 电大《英语II(一)》真题题库
- 宾馆住宿出租合同范本
- 种子的力量课件
- (完整版)《计算机控制系统》课后题答案-刘建昌等科学出版社
- 颈部断面与影像解剖ppt课件精选
- Q∕SY 05175-2019 原油管道运行与控制原则
- 汽车收音机天线的参数
- 供配电系统毕业设计
- 《艺术学概论考研》课件艺概绪论
- 工厂致全体员工一份感谢信
- 怎样做一名合格的高校中层领导干部( 54页)
- 中职一年级数学课外活动趣味数学基础知识竞赛课件(必答+选答+风险题含倒计时PPT)
- 工艺评审记录表
- 新加坡观赏鱼国际贸易发展模式及对我国的启示
评论
0/150
提交评论