Python线程创建和终止实例代码

  

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线程创建和终止实例代码