通過以下實例可以get到join()函數的作用:如果thread是某個子線程,則調用thread.join()的作用是確保thread子線程執行完畢後才能執行下一個線程。下面第一個例子中沒有調用join()函數,故沒有這個限制,所有線程執行順序都不定。
第二個例子中在每個子線程啓動start()後馬上調用了join()函數,這就確保了對於每一個子線程,必須等它執行完畢後才能執行下一個程序,故子線程是按順序執行的,且主線程中的print()方法是在所有的子線程執行完畢後才執行。
第三個例子中,對於子線程啓動start()後沒有馬上調用join()函數,故子線程的執行順序是不確定的,但是主線程中的print()前調用了每個子線程的join()函數,故print()要在所有的子線程執行完畢後才能執行。
(1)沒有使用join()函數,線程執行順序不定,主線程可能在所有子線程執行完之前就執行了
import threading
import time
def test(p):
time.sleep(0.001)
print(p)
ts = []
for i in range(15):
# target指定線程要執行的代碼,args指定該代碼的參數
th = threading.Thread(target=test, args=[i])
ts.append(th)
for i in ts:
i.start()
print("it is end !")
0
1
it is end !
4
2
3
5
(2)修改部分代碼如下:每次啓動子線程後,調用一次join()函數,可以看出線程按順序執行,且主線程在所有子線程執行完之 後才執行。
for i in ts:
i.start()
# 此處的join函數子線程按順序執行,即i線程跑完後才能繼續跑下一個線程
i.join()
print("it is end !")
0
1
2
3
4
5
it is end !
(3)修改部分代碼如下:可以看出子線程執行順序不定,但是主線程是在所有子線程執行完畢之後才執行的。
for i in ts:
i.start()
# 此處的join函數使子線程全部跑完再繼續往下跑子線程
for i in ts:
i.join()
print("it is end !")
1
0
4
5
2
3
it is end !