通過以下實例可以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()函數,可以看出線程按順序執行,且主線程在所有子線程執行完之后才執行。
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() # 此處的join函數子線程按順序執行,即i線程跑完后才能繼續跑下一個線程 i.join() print("it is end !") ----------------------------------------- # 0 # 1 # 2 # 3 # 4 # 5 # it is end !
(3)修改部分代碼如下:可以看出子線程執行順序不定,但是主線程是在所有子線程執行完畢之后才執行的。
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() # 此處的join函數使子線程全部跑完再繼續往下跑子線程 for i in ts: i.join() print("it is end !") -------------------------------------------- # 1 # 0 # 4 # 5 # 2 # 3 # it is end !