Python線程創(chuàng)建和終止實(shí)例代碼
python主要是通過(guò)thread和threading這兩個(gè)模塊來(lái)實(shí)現(xiàn)多線程支持。
python的thread模塊是比較底層的模塊,python的threading模塊是對(duì)thread做了一些封裝,能夠更加方便的被使用??墒莗ython(cpython)因?yàn)镚IL的存在無(wú)法使用threading充分利用CPU資源,假設(shè)想充分發(fā)揮多核CPU的計(jì)算能力須要使用multiprocessing模塊(Windows下使用會(huì)有諸多問(wèn)題)。
假設(shè)在對(duì)線程應(yīng)用有較高的要求時(shí)能夠考慮使用Stackless Python來(lái)完畢。Stackless Python是Python的一個(gè)改動(dòng)版本號(hào),對(duì)多線程編程有更好的支持,提供了對(duì)微線程的支持。微線程是輕量級(jí)的線程,在多個(gè)線程間切換所需的時(shí)間很多其它,占用資源也更少。
通過(guò)threading模塊創(chuàng)建新的線程有兩種方法:一種是通過(guò)threading.Thread(Target=executable Method)-即傳遞給Thread對(duì)象一個(gè)可運(yùn)行方法(或?qū)ο螅?另外一種是繼承threading.Thread定義子類并重寫(xiě)run()方法。另外一種方法中,唯一必須重寫(xiě)的方法是run(),可依據(jù)需要決定是否重寫(xiě)__init__()。值得注意的是,若要重寫(xiě)__init__(),父類的__init__()必需要在函數(shù)第一行調(diào)用,否則會(huì)觸發(fā)錯(cuò)誤“AssertionError: Thread.__init__() not called”
Python threading模塊不同于其它語(yǔ)言之處在于它沒(méi)有提供線程的終止方法,通過(guò)Python threading.Thread()啟動(dòng)的線程彼此是獨(dú)立的。若在線程A中啟動(dòng)了線程B,那么A、B是彼此獨(dú)立執(zhí)行的線程。若想終止線程A的同一時(shí)候強(qiáng)力終止線程B。一個(gè)簡(jiǎn)單的方法是通過(guò)在線程A中調(diào)用B.setDaemon(True)實(shí)現(xiàn)。
但這樣帶來(lái)的問(wèn)題是:線程B中的資源(打開(kāi)的文件、傳輸數(shù)據(jù)等)可能會(huì)沒(méi)有正確的釋放。所以setDaemon()并不是一個(gè)好方法,更為妥當(dāng)?shù)姆绞绞峭ㄟ^(guò)Event機(jī)制。以下這段程序體現(xiàn)了setDaemon()和Event機(jī)制終止子線程的差別。
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(threading.currentThread())+'stoped\n'
print 'after A stoped, '+FileA.name + ' closed? '+repr(FileA.closed)+'\n'
if not FileA.closed:
print 'You see the differents, the resource in subthread may not released with setDaemon()'
FileA.close()
if __name__ =='__main__':
print '-------stop subthread example with Event:----------\n'
evtstop()
print '-------Daemon stop subthread example :----------\n'
daemonstop()
執(zhí)行結(jié)果是:
-------stop subthread example with Event:---------- <_MainThread(MainThread, started 2436)>alive testA.txt closed? False testB.txt closed? False subthreadA alive subthreadB alive <_MainThread(MainThread, started 2436)>send stop signal close opened file in subthreadA close opened file in subthreadB subthreadA stoped subthreadB stoped <_MainThread(MainThread, started 2436)>stoped after A stoped, testA.txt closed? True after A stoped, testB.txt closed? True -------Daemon stop subthread example :---------- <_MainThread(MainThread, started 2436)>alive testA.txt closed? False subthreadA alive subthreadA stoped <_MainThread(MainThread, started 2436)>stoped after A stoped, testA.txt closed? False You see the differents, the resource in subthread may not released with setDaemon()
總結(jié)
以上就是本文關(guān)于Python線程創(chuàng)建和終止實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Django使用AJAX調(diào)用自己寫(xiě)的API接口的方法
這篇文章主要介紹了Django使用AJAX調(diào)用自己寫(xiě)的API接口的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
新手入門(mén)Python編程的8個(gè)實(shí)用建議
這篇文章主要介紹了Python編程的8個(gè)實(shí)用建議,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐
本文主要介紹了Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
pycharm終端無(wú)法激活conda環(huán)境的解決辦法
如果您在PyCharm終端中無(wú)法激活conda環(huán)境,可能是由于PyCharm沒(méi)有正確配置conda解釋器,這篇文章主要給大家介紹了關(guān)于pycharm終端無(wú)法激活conda環(huán)境的解決辦法,需要的朋友可以參考下2023-09-09
Python工程實(shí)踐之np.loadtxt()讀取數(shù)據(jù)
為了方便使用和記憶,有時(shí)候我們會(huì)把numpy.loadtxt()縮寫(xiě)成np.loadtxt(),這篇文章主要給大家介紹了關(guān)于Python工程實(shí)踐之np.loadtxt()讀取數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-07-07
python如何將多個(gè)模型的ROC曲線繪制在一張圖(含圖例)
這篇文章主要給大家介紹了關(guān)于python如何將多個(gè)模型的ROC曲線繪制在一張圖的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
基于Python實(shí)現(xiàn)語(yǔ)音合成小工具
TTS(Text To Speech)是一種語(yǔ)音合成技術(shù),可以讓機(jī)器將輸入文本以語(yǔ)音的方式播放出來(lái),實(shí)現(xiàn)機(jī)器說(shuō)話的效果。本文將使用pyttsx3庫(kù)作為示范,編寫(xiě)一個(gè)語(yǔ)音合成小工具,感興趣的可以了解一下2022-12-12

