软件编程思想-18

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十八章多线程编程√引言/动机√线程和进程√线程和Python√thread模块√threading模块√生产者-消费者问题和Queue模块√相关模块引言单线程:程序的运行由一个执行序列组成,执行序列按顺序在主机的中央处理器(CPU)中运行。阻塞型、非阻塞型多线程:多个外部输入;多个并发事务;可以被分成多个执行逻辑;线程和进程进程:独立的地址空间,内存,数据栈以及其它记录其运行轨迹的辅助数据。线程:所有的线程运行在同一个进程中,共享相同的运行环境。在单CPU的系统中,真正的并发是不可能的,每个线程会被安排成每次只运行一小会,然后就把CPU让出来,让其它的线程去运行。线程一个进程中的各个线程之间共享同一片数据空间,线程之间可以比进程之间更方便地共享数据以及相互通讯。如果多个线程共同访问同一片数据,则由于数据访问的顺序不一样,有可能导致数据结果的不一致的问题开始、顺序执行、结束Python、线程和全局解释器锁全局解释器锁(GIL)对Python解释器的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。在多线程环境中,Python按以下方式执行:1.设置GIL2.切换到一个线程去运行3.运行:a.指定数量的字节码指令,或者b.线程主动让出控制(可以调用time.sleep(0))4.把线程设置为睡眠状态5.解锁GIL在调用外部代码时,GIL会被锁定,直到函数结束为止没有线程支持的情况睡眠例子:两个“计时循环”。一个睡眠4秒种,一个睡眠2秒种,串行执行。fromtimeimportsleep,ctimedefloop0():print'startloop0at:',ctime()sleep(4)print'loop0doneat:',ctime()defloop1():print'startloop1at:',ctime()sleep(2)print'loop1doneat:',ctime()defmain():print'startingat:',ctime()loop0()loop1()print'allDONEat:',ctime()if__name__=='__main__':main()startingat:SunAug1305:03:342006startloop0at:SunAug1305:03:342006loop0doneat:SunAug1305:03:382006startloop1at:SunAug1305:03:382006loop1doneat:SunAug1305:03:402006allDONEat:SunAug1305:03:402006thread模块:提供基本的同步数据结构锁对象(lockobjectthread模块函数start_new_thread(function,args,kwargs=None)产生一个新的线程,在新线程中用指定的参数allocate_lock()分配一个LockType类型的锁对象exit()让线程退出LockType类型锁对象方法acquire(wait=None)尝试获取锁对象locked()如果获取了锁对象返回True,否则返回Falserelease()释放锁importthreadfromtimeimportsleep,ctimedefloop0():print'startloop0at:',ctime()sleep(4)print'loop0doneat:',ctime()defloop1():print'startloop1at:',ctime()sleep(2)print'loop1doneat:',ctime()defmain():print'startingat:',ctime()thread.start_new_thread(loop0,())thread.start_new_thread(loop1,())sleep(6)print'allDONEat:',ctime()startingat:SunAug1305:04:502006startloop0at:SunAug1305:04:502006startloop1at:SunAug1305:04:502006loop1doneat:SunAug1305:04:522006loop0doneat:SunAug1305:04:542006allDONEat:SunAug1305:04:562006采用锁来获悉子线程结束,而不是采用测算运行时间P.731startingat:SunAug1316:34:412006startloop0at:SunAug1316:34:412006startloop1at:SunAug1316:34:412006loop1doneat:SunAug1316:34:432006loop0doneat:SunAug1316:34:452006allDONEat:SunAug1316:34:452006threading模块:提供Thread类、同步机制。模块对象描述Thread表示一个线程的执行的对象Lock锁原语对象(跟thread模块里的锁对象相同)RLock可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)。Condition条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”。如,状态的改变或值的改变。Event通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。Semaphore为等待锁的线程提供一个类似“等候室”的结构BoundedSemaphore与Semaphore类似,只是它不允许超过初始值Timer与Thread相似,只是,它要等待一段时间后才开始运行。Thread类函数描述start()开始线程的执行run()定义线程的功能的函数(一般会被子类重写)join(timeout=None)程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒getName()返回线程的名字setName()设置线程的名字isAlive()布尔标志,表示这个线程是否还在运行中isDaemon()返回线程的daemon标志setDaemon(daemonic)把线程的daemon标志设为daemonic加入Thread对象的使用P.734(mtsleep3.py)startingat:SunAug1318:16:382006startloop0at:SunAug1318:16:382006startloop1at:SunAug1318:16:382006loop1doneat:SunAug1318:16:402006loop0doneat:SunAug1318:16:422006allDONEat:SunAug1318:16:422006使用可调用的类P.736(mtsleep4.py)增加了ThreadFunc类,创建Thread对象时会实例化一个可调用类ThreadFunc的类对象。Thread的子类实例(mtsleep5.py)P.739子类化Thread类,使用子类化实例创建线程。(1)MyThread子类的构造函数先调用基类的构造函数(2)run()函数MyThread子类化ThreadimportthreadingfromtimeimportctimeclassMyThread(threading.Thread):def__init__(self,func,args,name=''):threading.Thread.__init__(self)self.name=nameself.func=funcself.args=argsdefgetResult(self):returnself.resdefrun(self):print'starting',self.name,'at:',ctime()self.res=apply(self.func,self.args)printself.name,'finishedat:',ctime()斐波那契,阶乘和累加和(mtfacfib.py)分别在单线程和多线程环境中,运行三个递归函数。在多线程环境中实例化MyThread类,P.741threading模块中的其它函数函数描述activeCount()当前活动的线程对象的数量currentThread()返回当前线程对象enumerate()返回当前活动线程的列表settrace(func)为所有线程设置一个跟踪函数setprofile(func)为所有线程设置一个profile函数生产者-消费者问题和Queue模块生产者生产货物,然后把货物放到一个队列之类的数据结构中,生产货物所要花费的时间无法预先确定。消费者从队列中消耗生产者生产的货物的时间也是不确定的。函数描述queue(size)创建一个大小为size的Queue对象qsize()返回队列的大小(由于在返回的时候,队列可能会被其它线程修改,所以这个值是近似值)empty()如果队列为空返回True,否则返回Falsefull()如果队列已满返回True,否则返回Falseput(item,block=0)把item放到队列中,如果给了block(不为0),函数会一直阻塞到队列中有空间为止get(block=0)从队列中取一个对象,如果给了block(不为0),函数会一直阻塞到队列中有对象为止Queue模块可以用来进行线程间通讯,让各个线程之间共享数据。使用Queue对象、随机地生产(和消耗)货物。生产者和消费者相互独立并且并发地运行。(prodcons.py)P.745相关模块模块描述thread基本的,底级别的线程模块Threading高级别的线程和同步对象Queue供多线程使用的同步先进先出队列mutex互斥对象SocketServer具有线程控制的TCP和UDP管理器

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功