在threading
模塊中,最流行和最常用的調用是Thread
類,它主要用于創建和運行線程。Thread
類提供了創建和管理線程所需的所有主要功能。
線程對象是 Thread 類的對象,其中每個對象代表一個要在單獨的控制線程中執行的活動。
有兩種方法可以創建線程對象并指定要執行的活動:
- 通過將可調用對象傳遞給構造器
- 或者,在子類中覆蓋
run()
方法。
使用構造器或運行方法創建的線程對象可以使用start()
方法啟動。每當線程對象開始一個新的線程,那么在內部它的run()
方法被調用。
這里有一個簡單的例子:
在上面的例子中,我們還使用了time
模塊來使其中一個線程休眠。
Thread
類構造器的基本語法是:
Thread(group=None, target=None, name=None, args=(), kwargs={})
我們將在下一節解釋Thread
類構造器的參數。
線程是如何工作的?
一旦我們使用Thread
類構造器初始化了一個線程,我們必須調用它的start()
方法來啟動這個線程。
當線程開始時,線程被認為是活動的和活動的。當其run()
方法終止時,正常情況下,或者由于未處理的異常,線程停止活動或活動。isAlive()
方法測試線程在任何給定時間點是否活動。
其他線程可以調用一個線程的join()
方法來連接任何線程。這將阻塞調用線程,直到調用join()
方法的線程終止。
例如,在上面的代碼中,從主線程,我們調用t1.join()
和t2.join()
,因此主線程將等待線程t1
和t2
終止然后結束。
每個線程都有一個關聯的名稱。名稱可以傳遞給構造器,也可以分別使用setname()
和getname()
方法設置或檢索名稱。
一個標志守護線程可以與任何線程相關聯。這個標志的意義在于,當只剩下守護線程時,整個 python 程序就會退出??梢苑謩e使用setDaemon()
方法和getDaemon()
方法設置或檢索標志。
主線程對象對應 python 程序中控件的初始線程。它不是守護線程。
Thread
類中的函數和構造器
現在我們已經看到了一個運行線程的基本線程程序,是時候理解代碼以及探索Thread
類提供的所有重要方法了。
Thread
類構造器
以下是Thread
類構造器的基本語法:
Thread(group=None, target=None, name=None, args=(), kwargs={})
構造器允許許多參數,有些是必需的,有些不是。讓我們看看它們是什么:
-
group
:應該是無。它是為將來的擴展保留的。 -
target
:這是run()
方法要調用的可調用對象或任務。如您在頂部的代碼示例中所見,我們已經指定函數名 thread1 和 thread2 作為該參數的值。默認值為無。 -
name
:用于指定線程名稱。默認情況下,會按照格式 Thread-N 生成一個唯一的名稱,其中 N 是一個小的十進制數。 -
args
:這是目標調用的參數元組。我們可以在其中提供可用于 traget 方法的值。默認值為空,即()
-
kwargs
:這是目標調用的關鍵字參數字典。這默認為{}。 -
-
start()
方法
此方法用于啟動線程的活動。當我們調用這個方法時,內部調用run()
方法,該方法執行目標函數或可調用對象。
run()
方法
表示線程活動的方法。
您可以在擴展threading
模塊的Thread
類的子類中覆蓋這個方法。標準 run()方法調用傳遞給對象構造器的可調用對象作為目標參數,順序參數和關鍵字參數分別取自args
和kwargs
參數。
這里有一個簡單的例子,我們已經創建了一個子類,在這個子類中我們將覆蓋run()
方法。
join([timeout])
方法
當我們為任何線程調用此方法時,它會阻塞調用線程,直到其join()
方法被調用的線程正?;蛲ㄟ^未處理的異常終止。
如果要提供timeout
參數,應該是浮點數。
getName()
方法
此方法用于返回線程的名稱。
setName(name)
方法
用于設置線程的名稱。該名稱是一個僅用于識別目的的字符串。
isAlive()
方法
此方法返回線程是否活動。從start()
方法返回的那一刻起,直到其run()
方法終止,線程都是活動的。
isDaemon()
方法
此方法用于獲取線程守護程序標志的值。
setDaemon(daemonic)
方法
該方法用于將線程的守護標志設置為布爾值后臺。這必須在調用start()
方法之前調用。
當沒有活動的非守護線程時,整個 Python 程序就會退出。