python多線程編程方式分析樣本詳解

來源:互聯網
上載者:User
在Python多線程中如何建立一個線程對象

如果你要建立一個線程對象,很簡單,只要你的類繼承threading.Thread,然後在__init__裡首先調用threading.Thread的__init__方法即可

代碼如下:


import threading
class mythread(threading.Thread):
def __init__(self, threadname):
threading.Thread.__init__(self, name = threadname)

這才僅僅是個空線程,我可不是要他拉空車的,他可得給我幹點實在活。很簡單,重寫類的run()方法即可,把你要線上程執行時做的事情都放到裡面

代碼如下:


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)

以上代碼我們讓這個線程在執行之後每隔1秒輸出一次資訊到螢幕,10次後結束
getName()是threading.Thread類的一個方法,用來獲得這個線程對象的name。還有一個方法setName()當然就是來設定這個線程對象的name的了。
如果要建立一個線程,首先就要先建立一個線程對象
mythreadmythread1 = mythread('mythread 1′)
一個線程對象被建立後,他就處於“born”(誕生狀態)
如何讓這個Python多線程對象開始運行呢?只要調用線程對象的start()方法即可
mythread1.start()
現線上程就處於“ready”狀態或者也稱為“runnable”狀態。
奇怪嗎?不是已經start了嗎?為什麼不稱為“running”狀態呢?其實是有原因的。因為我們的電腦一般是不具有真正平行處理能力的。我們所謂的Python多線程只是把時間分成片段,然後隔一個時間段就讓一個線程執行一下,然後進入“sleeping ”狀態,然後喚醒另一個在“sleeping”的線程,如此迴圈runnable->sleeping->runnable… ,只是因為電腦執行速度很快,而時間片段間隔很小,我們感受不到,以為是同時進行的。所以說一個線程在start了之後只是處在了可以啟動並執行狀態,他什麼時候運行還是由系統來進行調度的。
那一個線程什麼時候會“dead”呢?一般來說當線程對象的run方法執行結束或者在執行中拋出異常的話,那麼這個線程就會結束了。系統會自動對“dead”狀態線程進行清理。
如果一個線程t1在執行的過程中需要等待另一個線程t2執行結束後才能啟動並執行話那就可以在t1在調用t2的join()方法

代碼如下:


def t1(…):

t2.join()

這樣t1在執行到t2.join()語句後就會等待t2結束後才會繼續運行。
但是假如t1是個死迴圈的話那麼等待就沒有意義了,那怎麼辦呢?可以在調用t2的join()方法的時候給一個浮點數做逾時參數,這樣這個線程就不會等到花兒也謝了了。我等你10s,你不回來我還不允許我改嫁啊?

代碼如下:


def t1(…):

t2.join(10)

如果一個進程的主線程運行完畢而子線程還在執行的話,那麼進程就不會退出,直到所有子線程結束為止,如何讓主線程結束的時候其他子線程也乖乖的跟老大撤退呢?那就要把那些不聽話的人設定為聽話的小弟,使用線程對象的setDaemon()方法,參數為bool型。True的話就代表你要聽話,我老大(主線程)扯呼,你也要跟著撤,不能拖後腿。如果是False的話就不用那麼聽話了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須線上程對象沒有調用start()方法之前調用,否則沒效果。

代碼如下:


t1 = mythread('t1′)
print t1.getName(),t1.isDaemon()
t1.setDaemon(True)
print t1.getName(),t1.isDaemon()
t1.start()
print ‘main thread exit'

當執行到 print 'main thread exit'後,主線程就退出了,當然t1這個線程也跟著結束了。但是如果不使用t1線程對象的setDaemon()方法的話,即便主線程結束了,還要等待t1線程自己結束才能退出進程。isDaemon()是用來獲得一個線程對象的Daemonflag狀態的。

如何來獲得與Python多線程有關的資訊呢?

獲得當前正在啟動並執行線程的引用
running = threading.currentThread()

獲得當前所有使用中的物件(即run方法開始但是未終止的任何線程)的一個列表
threadlist = threading.enumerate()

獲得這個列表的長度
threadcount = threading.activeCount()
查看一個線程對象的狀態調用這個線程對象的isAlive()方法,返回1代表處於"runnable"狀態且沒有"dead"

threadflag = threading.isAlive()

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.