python中多線程join是用來阻塞主線程的。
看下面的例子:
def fast():
print "in fast"
sleep(10)
print "done in fast"
def slow():
print "in slow"
sleep(15)
print "done in slow"
一個運行快,一個運行慢
def main():
start=datetime.datetime.now()
threads = []
f = [fast, slow]
l = len(f)
for i in range(l):
t=threading.Thread(target=f[i],args=())
threads.append(t)
for i in range(l):
threads[i].start()
for i in range(l):
threads[i].join()
print threads[i].getName()
end=datetime.datetime.now()
print end-start
print "Done on main"
exit()
請問上面的函數輸出的是什麼? 朋友們可以先想一下,如果對了,說明你掌握了join的用法了。
正確的輸出是:
in fast
in slow
done in fast
Thread-1
done in slow
Thread-2
0:00:15.001000
Done on main
如果沒有join的那一段,那麼 Done on main 將會在in slow後面就執行。
而答應線程名字那條語句,則是需要等到第一個線程的join結束後才能夠輸出。
那麼如果把上面fast和slow的時間改一下,改成:
def fast():
print "in fast"
sleep(15)
print "done in fast"
def slow():
print "in slow"
sleep(10)
print "done in slow"
那麼這次輸出的有是什麼呢?
in fast
in slow
done in slow
done in fast
Thread-1
Thread-2
0:00:15.001000
Done on main
而本身後臺同時運行着2個線程,join並沒有把線程2停止了。所以在線程1還在運行的時候(需要15s),而第二個線程 已經完成的輸出結果,因爲第二個線程運行時間只有10s。 所以也就是線程1join結束後,打印出線程1的名字, 這會線程2的名字馬上就會被打印出來,並沒有等待10s的時間。