多執行緒程式設計(python語言)
眾所周知,多執行緒程式設計是一種可以提高整個任務效能的並行處理方式。多執行緒程式設計的主要特點有以下幾個方面,本質上是非同步的;需要多個併發活動;每個活動的處理順序可能是不確定的,或者說是隨機的、不可預測的。這種程式設計任務可以被組織或劃分成多個執行流,其中每個執行流都有一個指定要完成的任務。根據應用的不同,這些子任務可能需要計算出中間結果,然後合併為最終的輸出結果。在學習多執行緒的一個主要的誤區就是,不要認為多執行緒就是計算機同時執行多個執行緒,實際上在程式執行的任意時間,只有一個執行緒會被直譯器執行。
Python 提供了多個模組來支援多執行緒程式設計,包括 thread、threading 和 Queue 模組等。程式是可以使用 thread 和 threading 模組來建立與管理執行緒。thread模組提供了基本的執行緒和鎖定支援;而threading模組提供了更高級別、功能更全面的執行緒管理。使用 Queue 模組,使用者可以建立一個佇列資料結構,用於在多執行緒之間進行共享。(PS:避免使用thread模組,應儘量使用更高級別的執行緒管理模組,如threading模組。不使用thread模組的一個主要原因是它對於子程序何時退出沒有控制,一旦主程序結束,其它程序均強制退出。)在這裡要引入一個新的概念,守護程序,如果一個程序被設定為守護程序,就表示這個程序不太重要,當主程序退出時不需要等待該程序執行完成。下面來舉幾個多執行緒的例子。
import threading from time import ctime,sleep class MyThread(threading.Thread): def __init__(self,func,args,name=''): threading.Thread.__init__(self) self.name=name self.func=func self.args=args def getResult(self): return self.res def run(self): print 'starting',self.name,'at:',ctime() self.res=self.func(*self.args) print self.name,'finished at:',ctime()
該程式將多執行緒封裝成MyThread類,以後使用時可直接呼叫。
from random import randint from time import sleep from Queue import Queue from myThread import MyThread def writeQ(queue): print 'producing object for Q...',queue.put('xxx',1) print "size now",queue.qsize() def readQ(queue): val=queue.get(1) print 'CONSUMED object from Q... size now',queue.qsize() def writer(queue,loops): for i in range(loops): writeQ(queue) sleep(randint(1,3)) def reader(queue,loops): for i in range(loops): readQ(queue) sleep(randint(2,5)) funcs=[writer,reader] nfuncs=range(len(funcs)) def main(): nloops=randint(2,5) q=Queue(32) threads=[] for i in nfuncs: t=MyThread(funcs[i],(q,nloops),funcs[i].__name__) threads.append(t) for i in nfuncs: threads[i].start() for i in nfuncs: threads[i].join() print 'all done' if __name__=='__main__': main()
該例子呼叫MyThread例項,完成簡單的函式呼叫。
我覺得裡邊的函式什麼都不用記,如果以後要用到多執行緒的話,將這個框架做相應的修改就行了。
本人對計算機視覺比較感興趣,有興趣的大神可以多多交流。