1. 程式人生 > >多執行緒程式設計(python語言)

多執行緒程式設計(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例項,完成簡單的函式呼叫。

我覺得裡邊的函式什麼都不用記,如果以後要用到多執行緒的話,將這個框架做相應的修改就行了。

本人對計算機視覺比較感興趣,有興趣的大神可以多多交流。