一、join()方法介紹
在Python的多線程編程中,指定線程(t)調用join()方法表示等待該線程執行完成,才開始執行後續代碼。
join()方法可以傳入一個可選的參數表示等待的時間,以秒為單位。
若不傳入參數則默認為阻塞主線程,直到指定線程完成為止。
import threading
import time
def foo():
for i in range(5):
print(i)
time.sleep(1)
t = threading.Thread(target=foo)
t.start()
print("Start")
t.join()
print("Finish")
在上述代碼中,調用join()方法會阻塞主線程,找到指定的線程t執行完成為止,然後才會輸出”Finish”。
二、join()方法的用例
1. 確保線程執行完成再執行後續代碼
在多線程編程中,由於線程的執行是並行的,因此主線程往往無法確定子線程何時結束,因此就需要使用join()方法來確保線程執行完成再執行後續的代碼。
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print("Start", self.name)
time.sleep(2)
print("Finish", self.name)
thread_1 = MyThread("Thread 1")
thread_2 = MyThread("Thread 2")
thread_1.start()
thread_2.start()
print("Start")
thread_1.join()
thread_2.join()
print("Finish")
在上述代碼中,我們創建了兩個MyThread線程,並通過調用start()方法啟動它們。再使用join()方法來等待線程執行完成並輸出”Finish”。
2. 限制線程執行時間
join()方法的一個可選參數是timeout,表示最多等待的時間,以秒為單位。若在timeout時間內指定線程都沒有執行完成,則會自動停止等待,並在後續代碼繼續執行。
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print("Start", self.name)
time.sleep(5)
print("Finish", self.name)
thread_1 = MyThread("Thread 1")
thread_1.start()
print("Start")
thread_1.join(2)
print("Finish")
在上述代碼中,我們創建了一個MyThread線程,並通過調用start()方法啟動它。然後使用join()方法,並傳入2秒作為超時時間,表示等待最多2秒,如果線程沒有完成則自動停止等待。
3. 阻塞主線程等待線程執行完成
如果調用join()方法時,不傳入任何參數,那麼默認就會阻塞主線程,直到指定線程執行完成為止。
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print("Start", self.name)
time.sleep(5)
print("Finish", self.name)
thread_1 = MyThread("Thread 1")
thread_1.start()
print("Start")
thread_1.join()
print("Finish")
在上述代碼中,我們創建了一個MyThread線程,並通過調用start()方法啟動它。然後在調用join()方法時不傳入任何參數,默認會阻塞主線程,直到線程執行完成。
三、join()方法的注意事項
1. join()方法的順序
在調用多個線程的join()方法時,需要注意join()方法的順序。如果A線程需要等待B線程執行完成才能執行,那麼應該先讓B線程調用join()方法再讓A線程調用join()方法。
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print("Start", self.name)
time.sleep(5)
print("Finish", self.name)
thread_1 = MyThread("Thread 1")
thread_2 = MyThread("Thread 2")
thread_1.start()
thread_2.start()
print("Start")
thread_2.join()
thread_1.join()
print("Finish")
在上述代碼中,我們創建了兩個MyThread線程,並通過調用start()方法啟動它們。先讓B線程調用join()方法,然後才讓A線程調用join()方法。
2. join()方法的使用時機
在使用join()方法時,需要考慮使用的時機。如果在程序中過早或過晚調用join()方法,都會對程序的性能產生影響。
過早調用join()方法可能會降低並發性能,並導致程序變慢。過晚調用join()方法則可能會導致線程不釋放。
3. 線程間通信
join()方法屬於線程同步的一種方式,可以用於線程間通信,但不是最佳的線程間通信方式。
在Python的多線程編程中,使用Queue隊列和Condition條件變數更適合進行線程間通信。
結語
join()方法在Python的多線程編程中是一個非常常用的方法。它能夠阻塞主線程,確保指定的線程執行完成後再執行後續代碼,並且可以通過給join()方法傳遞不同的參數,來控制線程的執行順序和等待時間。
在使用join()方法時,需要注意join()方法的順序和使用的時機,以避免對程序的性能產生影響。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/253158.html