1. 程式人生 > >python 多執行緒 join 的 細節問題 注意使用事項

python 多執行緒 join 的 細節問題 注意使用事項

	threads=[]
	f=[fast,slow]
	l=len(f)
	for i in range(l):
		t=MyThread(f[i],(),str(i))
		threads.append(t)
	
	for i in range(l):
		threads[i].start()

	for i in range(l):
		#pass
		threads[i].join()
		print threads[i].getName()
	print "Done on main"
	exit()

join的主要功能是阻塞執行緒,也就是使用了join後,後面的語句需要等當前程序完成之後才能 執行。

那麼看看下面的例子

class MyThread(threading.Thread):
	def __init__(self,fun,arg,name=""):
		threading.Thread.__init__(self)
		self.fun=fun
		self.arg=arg
		self.name=name
		#self.result


	def run(self):
		self.result=apply(self.fun,self.arg)
	
	def getName(self):
		return self.name


	def getResult(self):
		return self.result

上面是一個多執行緒的類。 待會用來呼叫的。

下面是main函式

def fast():
	print "in fast"
	sleep(15)
	print "done in fast"

def slow():
	print "in slow"
	sleep(10)
	print "done in slow"

	threads=[]
	f=[fast,slow]
	l=len(f)
	for i in range(l):
		t=MyThread(f[i],(),str(i))
		threads.append(t)
	
	for i in range(l):
		threads[i].start()

	for i in range(l):
		#pass
		threads[i].join()
		print threads[i].getName()
	print "Done on main"
	exit()


執行之後
輸出的結果是

in fast
in slow
done in slow
done in fast
0
1
Done on main


看到了嗎?

執行到thread[i].join() 這一行, 下一句沒有馬上被執行,需要等到done in fast 完成之後才執行, 而為什麼done in slow卻提前被執行了呢?

因為上面執行了threads[i].start() 後 兩個執行緒已經同時開啟了,但是由於在slow執行緒裡只sleep了10秒,而fast執行緒sleep了15秒,所以會先列印done in slow。

print threads[i].getName()

而上面這句則需要等執行緒1執行之後才會執行,

等執行完了上面那句之後,才會執行執行緒2的 join(), 由於此時的執行緒已經早已執行完畢,所以這句也沒有起到阻塞作用,故會馬上執行 下面只一句

print threads[i].getName()