设为首页 加入收藏

TOP

Python多线程之线程创建和终止(一)
2015-02-02 14:37:55 来源: 作者: 【 】 浏览:21
Tags:Python 线程 建和 终止

Python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python(cpython)由于GIL的存在无法使用threading充分利用CPU资源,如果想充分发挥多核CPU的计算能力需要使用multiprocessing模块(Windows下使用会有诸多问题)。


如果在对线程应用有较高的要求时可以考虑使用Stackless Python来完成。Stackless Python是Python的一个修改版本,对多线程编程有更好的支持,提供了对微线程的支持。微线程是轻量级的线程,在多个线程间切换所需的时间更多,占用资源也更少。


通过threading模块创建新的线程有两种方法:一种是通过threading.Thread(Target=executable Method)-即传递给Thread对象一个可执行方法(或对象);第二种是继承threading.Thread定义子类并重写run()方法。第二种方法中,唯一必须重写的方法是run(),可根据需要决定是否重写__init__()。值得注意的是,若要重写__init__(),父类的__init__()必须要在函数第一行调用,否则会触发错误“AssertionError: Thread.__init__() not called”


Python threading模块不同于其他语言之处在于它没有提供线程的终止方法,通过Python threading.Thread()启动的线程彼此是独立的,若在线程A中启动了线程B,那么A、B是彼此独立运行的线程。若想终止线程A的同时强力终止线程B,一个简单的方法是通过在线程A中调用B.setDaemon(True)实现。但这样带来的问题是:线程B中的资源(打开的文件、数据传输等)可能会没有正确的释放。所以setDaemon()并非一个好方法,更为妥当的方式是通过Event机制。下面这段程序体现了setDaemon()和Event机制终止子线程的区别。


import threading?
import time?
class mythread(threading.Thread):?
? ? def __init__(self,stopevt = None,File=None,name = 'subthread',Type ='event'):?
? ? ? ? threading.Thread.__init__(self)?
? ? ? ? self.stopevt = stopevt?
? ? ? ? self.name = name?
? ? ? ? self.File = File?
? ? ? ? self.Type = Type?
? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? def Eventrun(self):?
? ? ? ? while not self.stopevt.isSet():?
? ? ? ? ? ? print self.name +' alive\n'?
? ? ? ? ? ? time.sleep(2)?
? ? ? ? if self.File:?
? ? ? ? ? ? print 'close opened file in '+self.name+'\n'?
? ? ? ? ? ? self.File.close()?
? ? ? ? print self.name +' stoped\n'?
? ? ?
? ? def Daemonrun(self):?
? ? ? ? D = mythreadDaemon(self.File)?
? ? ? ? D.setDaemon(True)?
? ? ? ? while not self.stopevt.isSet():?
? ? ? ? ? ? print self.name +' alive\n'?
? ? ? ? ? ? time.sleep(2)?
? ? ? ? print self.name +' stoped\n'?
? ? def run(self):?
? ? ? ? if self.Type == 'event': self.Eventrun()?
? ? ? ? else: self.Daemonrun()?
class mythreadDaemon(threading.Thread):?
? ? def __init__(self,File=None,name = 'Daemonthread'):?
? ? ? ? threading.Thread.__init__(self)?
? ? ? ? self.name = name?
? ? ? ? self.File = File?
? ? def run(self):?
? ? ? ? while True:?
? ? ? ? ? ? print self.name +' alive\n'?
? ? ? ? ? ? time.sleep(2)?
? ? ? ? if self.File:?
? ? ? ? ? ? print 'close opened file in '+self.name+'\n'?
? ? ? ? ? ? self.File.close()?
? ? ? ? print self.name +' stoped\n'?
? ? ? ? ?
def evtstop():?
? ? stopevt = threading.Event()?
? ? FileA = open('testA.txt','w')?
? ? FileB = open('testB.txt','w')?
? ? A = mythread(stopevt,FileA,'subthreadA')?
? ? B = mythread(stopevt,FileB,'subthreadB')?
? ? print repr(threading.currentThread())+'alive\n'?
? ? print FileA.name + ' closed? '+repr(FileA.closed)+'\n'?
? ? print FileB.name + ' closed? '+repr(FileB.closed)+'\n'?
? ? A.start()?
? ? B.start()?
? ? time.sleep(1)?
? ? print repr(threading.currentThread())+'send stop signal\n'?
? ? stopevt.set()?
? ? A.join()?
? ? B.join()?
? ? print? repr(threading.currentThread())+'stoped\n'?
? ? print 'after A stoped, '+FileA.name + ' closed? '+repr(FileA.closed)+'\n'?
? ? print 'after A stoped, '+FileB.name + ' closed? '+repr(FileB.closed)+'\n'?
def daemonstop():?
? ? stopevt = threading.Event()?
? ? FileA = open('testA.txt','r')?
? ? A = mythread(stopevt,FileA,'subthreadA',Type = 'Daemon')?
? ? print repr(threading.currentThread())+'alive\n'?
? ? print FileA.name + ' closed? '+repr(FileA.closed)+'\n'?
? ? A.start()?
? ? time.sleep(1)?
? ? stopevt.set()?
? ? A.join()?
? ? print? repr(threadin

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python实现支持JSON存储和解析的.. 下一篇Android开发实践:编译VLC For An..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: