Python多線程:Threading中join()函數的理解

     通過以下實例可以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 !

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章