python主要是通过线程和线程这两个模块来实现多线程支持。
python的螺纹模块是比較底层的模块,python的线程模块是对线程做了一些封装,能够更加方便的被使用。可是python (cpython的)因为吉尔的存在无法使用线程充分利用CPU资源,假设想充分发挥多核CPU的计算能力须要使用多处理模块(Windows下使用会有诸多问题)。
假设在对线程应用有较高的要求时能够考虑使用Stackless Python来完毕.Stackless Python是Python的一个改动版本号,对多线程编程有更好的支持,提供了对微线程的支持。微线程是轻量级的线程,在多个线程间切换所需的时间很多其它,占用资源也更少。
通过螺纹模块创建新的线程有两种方法:一种是通过线程。线程(目标=执行方法)——即传递给线程对象一个可运行方法(或对象);另外一种是继承threading.Thread定义子类并重写运行()方法。另外一种方法中,唯一必须重写的方法是()运行,可依据需要决定是否重写__init__()。值得注意的是,若要重写__init__(),父类的__init__()必需要在函数第一行调用,否则会触发错误”AssertionError: Thread.__init__()而不是“
Python线程模块不同于其它语言之处在于它没有提供线程的终止方法,通过Python threading.Thread()启动的线程彼此是独立的。若在线程一个中启动了线程B,那么,B是彼此独立执行的线程。若想终止线程一个的同一时候强力终止线程B一个简单的方法是通过在线程一个中调用B.setDaemon(真正的)实现。
但这样带来的问题是:线程B中的资源(打开的文件,传输数据等)可能会没有正确的释放,所以setDaemon()并不是一个好方法,更为妥当的方式是通过事件机制。以下这段程序体现了setDaemon()和事件机制终止子线程的差别。
进口线程 导入的时间 类mythread (threading.Thread): def __init__(=没有自我,stopevt=None,文件,name=' subthread ', Type='事件'): threading.Thread.__init__(自我) 自我。stopevt=stopevt self.name=名字 自我。=文件 自我。类型=类型 def Eventrun(自我): 虽然不是self.stopevt.isSet (): 打印self.name +“活着\ n” time . sleep (2) 如果self.File: 打印的关闭打开的文件”+ self.name + ' \ n ' self.File.close () 打印self.name +“停止\ n” def Daemonrun(自我): D=mythreadDaemon (self.File) D.setDaemon(真正的) 虽然不是self.stopevt.isSet (): 打印self.name +“活着\ n” time . sleep (2) 打印self.name +“停止\ n” def运行(自我): 如果自我。类型==笆录?self.Eventrun () 其他:self.Daemonrun () 类mythreadDaemon (threading.Thread): def __init__(自我、文件=None, name=' Daemonthread '): threading.Thread.__init__(自我) self.name=名字 自我。=文件 def运行(自我): 而真正的: 打印self.name +“活着\ n” time . sleep (2) 如果self.File: 打印的关闭打开的文件”+ self.name + ' \ n ' self.File.close () 打印self.name +“停止\ n” def evtstop (): stopevt=threading.Event () FileA=开放(“testA.txt”、“w”) FileB=开放(“testB.txt”、“w”) 一个=mythread (stopevt FileA, subthreadA) B=mythread (stopevt、FileB subthreadB) repr (threading.currentThread打印())+“活着\ n” 打印FileA.name + '关闭# 63; ' + repr (FileA.closed) + ' \ n ' 打印FileB.name + '关闭# 63;' + repr (FileB.closed) + ' \ n ' A.start () B.start () time . sleep (1) repr (threading.currentThread打印())+ ' \ n发出停止信号 stopevt.set () A.join () B.join () repr (threading.currentThread打印())+“停止\ n” 打印“停止后,”+ FileA.name +“关闭# 63;' + repr (FileA.closed) + ' \ n ' 打印“停止后,”+ FileB.name +“关闭# 63; ' + repr (FileB.closed) + ' \ n ' def daemonstop (): stopevt=threading.Event () FileA=开放(“testA.txt”、“r”)=mythread (stopevt FileA subthreadA, Type='守护进程') repr (threading.currentThread打印())+“活着\ n” 打印FileA.name + '关闭# 63; ' + repr (FileA.closed) + ' \ n ' A.start () time . sleep (1) stopevt.set () A.join () repr (threading.currentThread打印())+“停止\ n” 打印“停止后,”+ FileA.name +“关闭# 63;' + repr (FileA.closed) + ' \ n ' 如果不是FileA.closed: 打印“你看到不同,资源与setDaemon subthread不得发布()” FileA.close () if __name__==癬_main__”: 打印”- - - - - -停止subthread示例事件:- - - - - - - - - - - \ n” evtstop () 打印”- - - - - -守护进程停止subthread例子:- - - - - - - - - - - \ n” daemonstop ()Python线程创建和终止实例代码