マルチスレッドプログラミング(python言語)

2499 ワード

マルチスレッドプログラミングは、タスク全体のパフォーマンスを向上させる並列処理であることはよく知られています.マルチスレッドプログラミングの主な特徴は以下のいくつかの方面があり、本質的に非同期である.複数の同時アクティビティが必要です.各アクティビティの処理順序は不確定であるか、ランダムで予測不可能である可能性がある.このプログラミングタスクは、各実行フローに完了するタスクを指定する複数の実行フローに編成または分割することができる.適用によっては、これらのサブタスクは、中間結果を計算し、最終的な出力結果にマージする必要がある場合があります.マルチスレッドを学習する主な誤りは、マルチスレッドがコンピュータが複数のスレッドを同時に実行するとは思わないことであり、実際にプログラムが実行される任意の時間に、1つのスレッドだけが解釈器によって実行されることである.
Pythonは、thread、threading、Queueモジュールなど、マルチスレッドプログラミングをサポートする複数のモジュールを提供しています.プログラムはthreadおよびthreadingモジュールを使用してスレッドを作成および管理できます.threadモジュールは基本的なスレッドとロックのサポートを提供します.一方、threadingモジュールは、より高いレベル、より包括的なスレッド管理を提供します.Queueモジュールを使用すると、マルチスレッド間で共有するためのキューデータ構造を作成できます.(PS:threadモジュールの使用を避けるには、threadingモジュールなどのより高いレベルのスレッド管理モジュールを使用する必要があります.threadモジュールを使用しない主な理由の1つは、サブプロセスがいつ終了するかについて制御されていないためです.メインプロセスが終了すると、他のプロセスは強制的に終了します.)ここで新しい概念を導入します.デーモンプロセスは、プロセスがデーモンプロセスに設定されている場合、このプロセスはあまり重要ではありません.メインプロセスが終了したときにプロセスの実行が完了するのを待つ必要はありません.次に、マルチスレッドの例をいくつか挙げます.
         
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インスタンスを呼び出し,簡単な関数呼び出しを完了する.
中の関数は何も覚えていないと思いますが、これからマルチスレッドを使うなら、このフレームワークを相応に修正すればいいと思います.
私はコンピュータの视覚に対して比较的に兴味を持って、兴味の大神は多く交流することができます.