多線程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()函數,可以看出線程按順序執行,且主線程在所有子線程執行完之后才執行。

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 !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM