python 多執行緒 join 的 細節問題 注意使用事項
阿新 • • 發佈:2019-02-11
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()