Python自由之路(三)多執行緒處理

ysisl222發表於2009-08-17
今天學習Python的多執行緒機制,在Python中主要使用Threading 模組,當然也有thread模組,只是這裡面的功能比較單一,而Threading 模組是在thread的基礎上進行的擴充套件,就像Python Document 上說的,這是一個Higher-level Threading interface .
 用threading模組建立執行緒,主要是對Thread類的例項化,根據建立例項的不同方法,主要使用下面三種:
  建立一個Thread 的例項,構造方法中傳入一個函式t=threading.Thread(target=_func_name,args=(引數元組)
  建立一個Thread 的例項,構造方法中傳入一個可呼叫的類物件定義一個類class ThreadFunc,類中必須重寫__call__函式供執行緒呼叫t=threading.Thread(target=ThreadFunc例項)
  從Thread派生出一個子類,建立子類的例項class MyThread(threading.Thread)重寫threading.Thread中的run函式供執行緒執行。
所有上述執行緒建立後,都採用執行緒例項的start()的方法啟動,join()方法加自旋鎖。
關於自旋鎖,多個執行緒執行時,怎樣確保所有重要執行緒都已經結束呢?在threading模組中,每個Thread類都有一個join函式,其實就是一個等待此執行緒鎖釋放的無限迴圈(也稱為自旋鎖)。當一個執行緒例項啟動時,顯式呼叫join()會使主執行緒被迫等待該執行緒的自旋鎖釋放。這種情況在順序過程的任務流程式中比較常見。
學到這裡,我想,不妨做一個通用的模組,對任意過程實現執行緒同步處理。比如一個下載過程,只需要傳入URL就可以了,主執行緒不必等待下載完成才執行其他任務,對於這樣一個特殊的過程函式,我們可以使用函式修飾功能。
 class wraps:
 #=======================================
 # only for process without result,
 # and main do not wait for it finished
 #=======================================     
    @staticmethod
    def thread(f):
        def wrappFunc(*args,**kargs):
            try:
                _thread=BaseThread(f,args,f.__name__)
                _thread.start()
            except Exception,e:
                print e
        return wrappFunc 
 其中BaseThread繼承了threading.Thread類,負責執行緒物件的建立工作。
 class BaseThread(Thread):
    def __init__(self,func,args,name=“):
        threading.Thread.__init__(self)
        self.name=name
        self.args=args
        self.func=func
        self.res=None
    def getResult(self):
        return self.res
    def run(self):
        print `starting`,self.name,`at:`,ctime()
        self.res=self.func(*self.args)
        print `finished`,self.name,`at:`,ctime()
 把這些類放在一個單獨的模組中basethread中,看看如何在我們平常的程式中呼叫:
 From basethread import wraps
 @wraps.thread
def test(sec):
    for i in range(sec):
        sleep(1)
  
test(4)
test(3)
test(1)
test(2)
結果沒上傳上來 ,大意就是都是同時開始,按1,2,3,4秒結束,共耗時4秒。
還有一個更強大的模組Mutiprocessing —– process – base threading interface,以後再討論。


相關文章