python多線(xiàn)程編程方式分析示例詳解
在Python多線(xiàn)程中如何創(chuàng)建一個(gè)線(xiàn)程對(duì)象
如果你要?jiǎng)?chuàng)建一個(gè)線(xiàn)程對(duì)象,很簡(jiǎn)單,只要你的類(lèi)繼承threading.Thread,然后在__init__里首先調(diào)用threading.Thread的__init__方法即可
import threading
class mythread(threading.Thread):
def __init__(self, threadname):
threading.Thread.__init__(self, name = threadname)
這才僅僅是個(gè)空線(xiàn)程,我可不是要他拉空車(chē)的,他可得給我干點(diǎn)實(shí)在活。很簡(jiǎn)單,重寫(xiě)類(lèi)的run()方法即可,把你要在線(xiàn)程執(zhí)行時(shí)做的事情都放到里面
import threading
import time
class mythread(threading.Thread):
def __init__(…):
….
def run(self):
for i in range(10):
print self.getName, i
time.sleep(1)
以上代碼我們讓這個(gè)線(xiàn)程在執(zhí)行之后每隔1秒輸出一次信息到屏幕,10次后結(jié)束
getName()是threading.Thread類(lèi)的一個(gè)方法,用來(lái)獲得這個(gè)線(xiàn)程對(duì)象的name。還有一個(gè)方法setName()當(dāng)然就是來(lái)設(shè)置這個(gè)線(xiàn)程對(duì)象的name的了。
如果要?jiǎng)?chuàng)建一個(gè)線(xiàn)程,首先就要先創(chuàng)建一個(gè)線(xiàn)程對(duì)象
mythreadmythread1 = mythread('mythread 1′)
一個(gè)線(xiàn)程對(duì)象被創(chuàng)建后,他就處于“born”(誕生狀態(tài))
如何讓這個(gè)Python多線(xiàn)程對(duì)象開(kāi)始運(yùn)行呢?只要調(diào)用線(xiàn)程對(duì)象的start()方法即可
mythread1.start()
現(xiàn)在線(xiàn)程就處于“ready”狀態(tài)或者也稱(chēng)為“runnable”狀態(tài)。
奇怪嗎?不是已經(jīng)start了嗎?為什么不稱(chēng)為“running”狀態(tài)呢?其實(shí)是有原因的。因?yàn)槲覀兊挠?jì)算機(jī)一般是不具有真正并行處理能力的。我們所謂的Python多線(xiàn)程只是把時(shí)間分成片段,然后隔一個(gè)時(shí)間段就讓一個(gè)線(xiàn)程執(zhí)行一下,然后進(jìn)入“sleeping ”狀態(tài),然后喚醒另一個(gè)在“sleeping”的線(xiàn)程,如此循環(huán)runnable->sleeping->runnable… ,只是因?yàn)橛?jì)算機(jī)執(zhí)行速度很快,而時(shí)間片段間隔很小,我們感受不到,以為是同時(shí)進(jìn)行的。所以說(shuō)一個(gè)線(xiàn)程在start了之后只是處在了可以運(yùn)行的狀態(tài),他什么時(shí)候運(yùn)行還是由系統(tǒng)來(lái)進(jìn)行調(diào)度的。
那一個(gè)線(xiàn)程什么時(shí)候會(huì)“dead”呢?一般來(lái)說(shuō)當(dāng)線(xiàn)程對(duì)象的run方法執(zhí)行結(jié)束或者在執(zhí)行中拋出異常的話(huà),那么這個(gè)線(xiàn)程就會(huì)結(jié)束了。系統(tǒng)會(huì)自動(dòng)對(duì)“dead”狀態(tài)線(xiàn)程進(jìn)行清理。
如果一個(gè)線(xiàn)程t1在執(zhí)行的過(guò)程中需要等待另一個(gè)線(xiàn)程t2執(zhí)行結(jié)束后才能運(yùn)行的話(huà)那就可以在t1在調(diào)用t2的join()方法
def t1(…):
…
t2.join()
這樣t1在執(zhí)行到t2.join()語(yǔ)句后就會(huì)等待t2結(jié)束后才會(huì)繼續(xù)運(yùn)行。
但是假如t1是個(gè)死循環(huán)的話(huà)那么等待就沒(méi)有意義了,那怎么辦呢?可以在調(diào)用t2的join()方法的時(shí)候給一個(gè)浮點(diǎn)數(shù)做超時(shí)參數(shù),這樣這個(gè)線(xiàn)程就不會(huì)等到花兒也謝了了。我等你10s,你不回來(lái)我還不允許我改嫁???
def t1(…):
…
t2.join(10)
如果一個(gè)進(jìn)程的主線(xiàn)程運(yùn)行完畢而子線(xiàn)程還在執(zhí)行的話(huà),那么進(jìn)程就不會(huì)退出,直到所有子線(xiàn)程結(jié)束為止,如何讓主線(xiàn)程結(jié)束的時(shí)候其他子線(xiàn)程也乖乖的跟老大撤退呢?那就要把那些不聽(tīng)話(huà)的人設(shè)置為聽(tīng)話(huà)的小弟,使用線(xiàn)程對(duì)象的setDaemon()方法,參數(shù)為bool型。True的話(huà)就代表你要聽(tīng)話(huà),我老大(主線(xiàn)程)扯呼,你也要跟著撤,不能拖后腿。如果是False的話(huà)就不用那么聽(tīng)話(huà)了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須在線(xiàn)程對(duì)象沒(méi)有調(diào)用start()方法之前調(diào)用,否則沒(méi)效果。
t1 = mythread('t1′)
print t1.getName(),t1.isDaemon()
t1.setDaemon(True)
print t1.getName(),t1.isDaemon()
t1.start()
print ‘main thread exit'
當(dāng)執(zhí)行到 print 'main thread exit'后,主線(xiàn)程就退出了,當(dāng)然t1這個(gè)線(xiàn)程也跟著結(jié)束了。但是如果不使用t1線(xiàn)程對(duì)象的setDaemon()方法的話(huà),即便主線(xiàn)程結(jié)束了,還要等待t1線(xiàn)程自己結(jié)束才能退出進(jìn)程。isDaemon()是用來(lái)獲得一個(gè)線(xiàn)程對(duì)象的Daemonflag狀態(tài)的。
如何來(lái)獲得與Python多線(xiàn)程有關(guān)的信息呢?
獲得當(dāng)前正在運(yùn)行的線(xiàn)程的引用
running = threading.currentThread()
獲得當(dāng)前所有活動(dòng)對(duì)象(即run方法開(kāi)始但是未終止的任何線(xiàn)程)的一個(gè)列表
threadlist = threading.enumerate()
獲得這個(gè)列表的長(zhǎng)度
threadcount = threading.activeCount()
查看一個(gè)線(xiàn)程對(duì)象的狀態(tài)調(diào)用這個(gè)線(xiàn)程對(duì)象的isAlive()方法,返回1代表處于"runnable"狀態(tài)且沒(méi)有"dead"
threadflag = threading.isAlive()
相關(guān)文章
Python內(nèi)置方法和屬性應(yīng)用:反射和單例(推薦)
這篇文章主要介紹了Python內(nèi)置方法和屬性應(yīng)用:反射和單例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Python線(xiàn)性網(wǎng)絡(luò)實(shí)現(xiàn)分類(lèi)糖尿病病例
什么是線(xiàn)性規(guī)劃?想象一下,您有一個(gè)線(xiàn)性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線(xiàn)性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對(duì)應(yīng)于某些其他線(xiàn)性函數(shù)的最大值或最小值2022-10-10
詳解pandas使用drop_duplicates去除DataFrame重復(fù)項(xiàng)參數(shù)
這篇文章主要介紹了詳解pandas使用drop_duplicates去除DataFrame重復(fù)項(xiàng)參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
pyinstaller打包exe程序的步驟和添加依賴(lài)文件的實(shí)現(xiàn)
這篇文章主要介紹了pyinstaller打包exe程序的步驟和添加依賴(lài)文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python實(shí)現(xiàn)npy/mat文件的保存與讀取
除了常用的csv文件和excel文件之外,我們還可以通過(guò)Python把數(shù)據(jù)保存文npy文件格式和mat文件格式。本文為大家展示了實(shí)現(xiàn)npy文件與mat文件的保存與讀取的示例代碼,需要的可以參考一下2022-04-04
python 常用日期處理-- datetime 模塊的使用
這篇文章主要介紹了python 如何對(duì)日期進(jìn)行處理,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09
詳解用Python為直方圖繪制擬合曲線(xiàn)的兩種方法
這篇文章主要介紹了詳解用Python為直方圖繪制擬合曲線(xiàn)的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

