《Python程序设计教程》第10章 Python多线程机制_第1页
《Python程序设计教程》第10章 Python多线程机制_第2页
《Python程序设计教程》第10章 Python多线程机制_第3页
《Python程序设计教程》第10章 Python多线程机制_第4页
《Python程序设计教程》第10章 Python多线程机制_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章Python多线程机制内容简介本章教学目标:了解Python多线程机制;熟悉线程的创建方法;理解线程的属性和函数;明白线程的状态与守护线程;掌握线程的同步机制;学会设计多线程程序。本章重点内容: Thread的创建方法;Thread的属性和函数;Thread的同步机制;多线程程序的设计。10.1

Python多线程机制什么是进程?所谓“进程”就是程序在处理机上的一次执行过程。它由程序、数据和进程控制块PCB三部分组成,它是程序的分配资源的最小单元。什么是线程?我们把进程内的一个相对独立的、可调度的执行单元称为“线程”。线程包括程序块、数据和线程控制块TCB三部分,它是系统独立调度和分

派CPU的最小单元,是程序的最小执行单元。一进程中的可以有多个线程其中一个是主线程,线程它们共享该进程所拥有的全部资源。10.2线程的创建

10.2.1用Thread类的构造函数创建线程

Thread类的构造函数是:Thread(group=None,

target=None,

name=None,

args=(),

kwargs=None,daemon=False)其中,参数含义如表10-1所示。10.2线程的创建(续)

10.2.1用Thread类的构造函数创建线程

Thread的具体创建过程如下:导入线程模块。如:import

threading定义线程调度的目标函数,用来完成线程的主体任务。如:def

函数名(参数):函数体用构造函数创建一个线程对象。调用线程对象的start()方法来启动该线程。【例10-1】用Thread类的构造函数创建线程的实例。//代码见附件10.2线程的创建(续)10.2.2继承Thread类创建线程除了用Thread类创建线程,还可以用Thread的子类创建线程。不过,该方法不能随便给目标函数命名,而是重写父类Thread的目标函数run()例10-2用继承Thread方式重写例10-1的功能。【例10-2】继承Thread类创建多线程的实例。//代码见附件10.3

Thread的属性和方法线程最常用的属性是:name、ident和daemon,如表10-2所示:10.3

Thread的属性和方法线程对象的常见方法如表10-3所示:【例10-3】

Thread类的属性和方法测试实例。//代码见附件10.4线程的状态与守护线程10.4.1

线程的状态对于多线程的程序,一个线程不可能始终独占CPU,CPU会在不同线程之间切换,因此线程存在多种状态,通常有新建、就绪、运行、阻塞和死亡等五种状态,于是线程的生命周期会在这五种状态之间切换,请看图10-1。【例10-4】线程状态的测试实例。//代码见附件10.4线程的状态与守护线程(续)10.4.2

守护线程线程的生命周期除了经历五种状态,它的运行还分为前台运行和后台运行。线程类有一个daemon属性,如果其值为True则线程是后台线程,不过其默认值为False,所以我们之前接触的线程都是前台线程,它们在前台运行。前台线程通常比较活跃,用于同用户直接交互;后台线程则不太活跃,它们给前台线程提供服务,所以也称为守护线程,例如Python解释器中的垃圾回收线程就是一种后台线程。后台线程的生命依托于前台线程当前台线程已经全部死亡的时候,后台线程也会随之死亡,下面我们来看一个实例。【例10-5】守护线程测试实例。//代码见附件10.5线程的同步机制多个线程在执行过程中会相互合作和共享互斥资源,它们共同完成某项任务,Python的threading模块提供了以下5种同步机制。10.5.1

互斥锁Lock线程访问的共享资源,有些是互斥资源,即在同一时间只能有一个线程能访问它。当一个线程拥有了互斥资源的访问权后,其它的所有线程都必须阻塞,等待该线程释放其访问权,即使这些线程的下一条指令并不会互相影响,我们把线程访问互斥资源的代码称为临界区。10.5线程的同步机制(续)为了保护对临界区的访问,Python的threading模块提供了互斥锁

Lock,它有以下两个主要方法:lock.acquire(timeout=None):该方法在线程进入临界区前调用,功能是申请获得钥匙与锁门,如果不成功则阻塞等待;timeout参数表示等待timeout秒,没有该参数则一直等待到其它线程来唤醒它。lock.release():该方法在线程离开临界区时调用,功能是归还钥匙与开门,并且唤醒其它等待该资源的线程。【例10-6】互斥锁Lock在小船访问控制中的应用实例。//代码见附件10.5线程的同步机制(续)10.5.2条件变量Condition线程之间还有同步问题,假如两个线程相互合作,它们共同完成某项任务,这时要考虑二者的同步,例如生产者和消费者。threading模块提供了条件变量Condition,它可以实现线程的同步,它使已经获得锁的线

程在条件不满足的时候主动的放弃执行,并通知唤醒其他阻塞的线程执行等下次条件满足后被其它线程唤醒。10.5线程的同步机制(续)Condition包含以下主要方法:acquire(timeout=None):申请获得条件锁钥,如成功则锁门后继续执行,如不成功则阻塞等待。其中timeout参数表示等待timeout秒,没有该参数则一直等待直到其它线程来唤醒它。release():归还钥匙,并且开门唤醒其它等待该资源的线程。

3.wait(timeout=None):线程主动挂起等待,直到收到notify通知才被重新唤其中timeout参数表示等待timeout秒,没有该参数则一直等待到其它线程来唤醒它。4.notify(n=1):从等待池中唤醒n个线程。

5.notifyAll():从等待池中唤醒所有线程。【例10-7】用条件变量Condition设计线程控制览车的升降。//代码见附件10.5线程的同步机制(续)10.5.3事件Event该对象也可以用于线程间的同步,它内置了一个初始为False的信号标志,一个线程通过改变其值为True或False来控制其它线程的激活与阻塞,其主要方法如下:set():设置Event对象的内部信号标志为True。clear():清除Event对象的内部信号标志,即将其设为False。3.isSet():判断Event对象的内部信号标志的状态,返回True或False。4.wait():根据Event对象的内部信号标志的值决定该线程的状态,如果为False则线程阻塞,为True则激活。【例10-8】蛙眼探测灯事件的响应控制线程。//代码见附件10.5线程的同步机制(续)10.5.4

信号量Semaphore前面介绍的锁(Lock)只有一把钥匙,每次只允许一个进程进入临界区,但生活中有些资源允许多人访问,如房间,它不像换衣间,允许多人同时进入。Python的信号量(Semaphore)解决了该问题,因为它有一个内置的计数器,可以记录当前剩余几把钥匙,所以允许多个线程同时进入临界区。10.5线程的同步机制(续)信号量的构造方法是Semaphore(value=1),其中参数value是计数器的初始值,代表一把锁配几把钥匙。信号量也具有acquire()和release()方法,当某个线程调用acquire()方法时,如果当前计数器>0,则计数器-

1,返回True,否则阻塞;当某个线程调用release()方法时,计数器+1。【例10-9】用信号量Semaphore设计只允许乘坐4人的览车控制程序。//代码见附件10.5线程的同步机制(续)10.5.5

递归锁RLock前面介绍的Lock可以解决访问单个共享资源的互斥问题,但如果完成一项任务要访问多个互斥资源,这时如果处理不当会发生“死锁”。进程死锁是指多个进程共享多个资源时,分别占有对方需要的部分资源,并且同时在等待对方占有的部分资源,双方都不释放,这时进程不能继续运行。例如,吃饭通常用碗和勺,现在只有一个碗和一个勺,如果一人抢到了碗,另外一人抢到了勺,两人都不愿把自己抢到的吃饭工具给对方,结果是双方都吃不到饭,这种现象就叫死锁。10.5线程的同步机制(续)为了解决死锁问题,Python的threading模块提供了递归锁RLock,也称为可重入锁。对于已经获得该锁的线程可以继续多次获得该锁,而不会被阻塞。该对象也具有acquire()和release()方法,这点同互斥锁Lock一样,下面用递归锁RLock来编写一个程序实例。【例10-10】用递归锁RLock编程实现对小船资源的控制。//代码见

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论