python threading模組2

來源:互聯網
上載者:User

標籤:

Thread 是threading模組中最重要的類之一,可以使用它來建立線程。有兩種方式來建立線程:一種是通過繼承Thread類,重寫它的run方法;另一種是建立一個threading.Thread對象,在它的初始化函數(__init__)中將可調用對象作為參數傳入。下面分別舉例說明。先來看看通過繼承threading.Thread類來建立線程的例子:

#coding=gbkimport threading, time, randomcount = 0class Counter(threading.Thread):    def __init__(self, lock, threadName):        ‘‘‘@summary: 初始化對象。                @param lock: 瑣對象。        @param threadName: 線程名稱。        ‘‘‘        super(Counter, self).__init__(name = threadName)          self.lock = lock        def run(self):        ‘‘‘@summary: 重寫父類run方法,線上程啟動後執行該方法內的代碼。        ‘‘‘        global count        self.lock.acquire()        for i in xrange(10000):            count = count + 1        self.lock.release()lock = threading.Lock()for i in range(5):     Counter(lock, "thread-" + str(i)).start()time.sleep(2)    #確保線程都執行完畢print count

 

在代碼中,我們建立了一個Counter類,它繼承了threading.Thread。初始化函數接收兩個參數,一個是瑣對象,另一個是線程的名稱。在Counter中,重寫了從父類繼承的run方法,run方法將一個全域變數逐一的增加10000。在接下來的代碼中,建立了五個Counter對象,分別調用其start方法。最後列印結果。這裡要說明一下run方法 和start方法: 它們都是從Thread繼承而來的,run()方法將線上程開啟後執行,可以把相關的邏輯寫到run方法中(通常把run方法稱為活動[Activity]。);start()方法用於啟動線程。

 

第二種方法:

import threading, time, randomcount = 0lock = threading.Lock()def doAdd():    ‘‘‘@summary: 將全域變數count 逐一的增加10000。    ‘‘‘    global count, lock    lock.acquire()    for i in xrange(10000):        count = count + 1    lock.release()for i in range(5):    threading.Thread(target = doAdd, args = (), name = ‘thread-‘ + str(i)).start()time.sleep(2)    #確保線程都執行完畢print count

 

在這段代碼中,我們定義了方法doAdd,它將全域變數count 逐一的增加10000。然後建立了5個Thread對象,把函數對象doAdd 作為參數傳給它的初始化函數,再調用Thread對象的start方法,線程啟動後將執行doAdd函數。這裡有必要介紹一下threading.Thread類的初始化函數原型:
def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
  參數group是預留的,用於將來擴充;
  參數target是一個可調用對象(也稱為活動[activity]),線上程啟動後執行;
  參數name是線程的名字。預設值為“Thread-N“,N是一個數字。
  參數args和kwargs分別表示調用target時的參數列表和關鍵字參數。

 

Thread類還定義了以下常用方法與屬性:

Thread.getName() 
Thread.setName()
Thread.name

  用於擷取和設定線程的名稱。

Thread.ident

  擷取線程的標識符。線程標識符是一個非零整數,只有在調用了start()方法之後該屬性才有效,否則它只返回None。

Thread.is_alive() 
Thread.isAlive()

  判斷線程是否是啟用的(alive)。從調用start()方法啟動線程,到run()方法執行完畢或遇到未處理異常而中斷 這段時間內,線程是啟用的。

Thread.join([timeout])

  調用Thread.join將會使主調線程堵塞,直到被調用線程運行結束或逾時。參數timeout是一個數實值型別,表示逾時時間,如果未提供該參數,那麼主調線程將一直堵塞到被調線程結束。下面舉個例子說明join()的使用:

import threading, timedef doWaiting():    print ‘start waiting:‘, time.strftime(‘%H:%M:%S‘)    time.sleep(3)    print ‘stop waiting‘, time.strftime(‘%H:%M:%S‘)thread1 = threading.Thread(target = doWaiting)thread1.start()time.sleep(1)  #確保線程thread1已經啟動print ‘start join‘thread1.join()    #將一直堵塞,直到thread1運行結束。print ‘end join‘

 

threading.RLock和threading.Lock

  在threading模組中,定義兩種類型的瑣:threading.Lock和threading.RLock。它們之間有一點細微的區別,通過比較下面兩段代碼來說明:

import threadinglock = threading.Lock()    #Lock對象lock.acquire()lock.acquire()  #產生了死瑣。lock.release()lock.release()
import threadingrLock = threading.RLock()  #RLock對象rLock.acquire()rLock.acquire()    #在同一線程內,程式不會堵塞。rLock.release()rLock.release()

這兩種瑣的主要區別是:RLock允許在同一線程中被多次acquire。而Lock卻不允許這種情況。注意:如果使用RLock,那麼acquire和release必須成對出現,即調用了n次acquire,必須調用n次的release才能真正釋放所佔用的瑣。

 

問題:鎖來鎖去鎖那麼多次到底是為了什嗎???

python threading模組2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.