正如我們在之前的教程中所看到的,threading
模塊用于在 python 中創建、控制和管理線程。在本教程中,我們將討論由threading
模塊定義的各種函數和對象類型。
threading
模塊功能
該模塊提供以下管理線程的功能:
這是上一個教程的代碼片段,我們將使用它來查看threading
模塊提供的各種功能。
穿線。active_count()
功能
該函數返回當前活動的Thread
對象的數量。
import time
import threading
def thread1(i):
time.sleep(3)
#print('No. printed by Thread 1: %d' %i)
def thread2(i):
time.sleep(3)
#print('No. printed by Thread 2: %d' %i)
if __name__ == '__main__':
t1 = threading.Thread(target=thread1, args=(10,))
t2 = threading.Thread(target=thread2, args=(12,))
t1.start()
t2.start()
print("No. of active threads: " + threading.active_count())
t1.join()
t2.join()
活動線程數:3
嘗試在上面的終端中運行該代碼。您將看到線程數為 3 ,因為我們已經創建了 2 個線程,并且在主線程中正在進行完整的執行。
穿線。current_thread()
該函數將返回當前線程對象,對應調用者的控制線程(當前在調用者的控制中)。如果調用者的控制線程不是通過線程模塊(例如主線程)創建的,則返回一個功能有限的偽線程對象。
import time
import threading
def thread1(i):
time.sleep(3)
#print('No. printed by Thread 1: %d' %i)
def thread2(i):
time.sleep(3)
#print('No. printed by Thread 2: %d' %i)
if __name__ == '__main__':
t1 = threading.Thread(target=thread1, args=(10,))
t2 = threading.Thread(target=thread2, args=(12,))
t1.start()
t2.start()
print("Current thread is: " + threading.current_thread())
t1.join()
t2.join()
當前線程為:
穿線。get_ident()
該函數返回當前線程的線程標識符。這是一個非零整數值。如果我們啟動了線程,那么這個方法將返回它的標識符,否則,它將返回無。
我們可以使用這個方法來索引線程特定數據的字典。當一個線程退出(停止)并創建另一個線程時,可以回收線程標識符。
threading.get_ident()
140578859194112
穿線。enumerate()
該方法返回當前活動的所有Thread
對象的列表。該列表包括后臺線程(當程序退出時,與之相關的所有后臺線程都將自動終止)當前線程創建的虛擬線程對象,以及主線程。
此列表中不存在已終止的線程和尚未啟動的線程。
threading.enumerate()
[ 、、 ]
穿線。main_thread()
此方法返回主 Thread
對象。在正常情況下,主線程是啟動 python 解釋器的線程。
threading.main_thread()
穿線。settrace(fun)
該方法用于為使用threading
模塊啟動的所有線程設置跟蹤函數/鉤子。對于每個線程,跟蹤函數被傳遞給sys.settrace()
方法,該方法在調用run()
方法之前被附加到線程。
我們希望作為跟蹤函數的回調函數將接收三個參數:frame
(來自正在運行的代碼的堆棧幀)event
(一個命名通知類型的字符串)和arg
(一個特定于事件的值)
def hello(frame, event, arg):
print("Hello, I am a trace hook.")
threading.settrace(hello)
嘗試更新頂部終端中的代碼。將hello
函數放在主方法和語句threading.settrace(hello)
之外,就在我們為線程調用start
方法的語句之上。
穿線。setprofile(fun)
此方法用于為從threading
模塊啟動的所有線程設置配置文件函數。和 trace 函數一樣,profile 函數也傳遞給每個線程的sys.setprofile()
方法,在調用run()
方法之前附加到線程。
threading.setprofile(hello)
穿線。stack_size([size])
此方法返回創建新線程時使用的線程堆棧大小。size
參數是可選的,可用于設置創建后續線程所用的堆棧大小,必須為 0 或正整數(D =默認值為 0)。
如果不支持更改線程堆棧大小,則會引發運行時錯誤。
如果指定的堆棧大小無效,將引發值錯誤。
目前 32 KiB 是支持的最小堆棧大小,為解釋器提供足夠的堆??臻g。
穿線。TIMEOUT_MAX
除了上述指定的功能外,threading
模塊還定義了一個常數。如果您指定的超時值大于TIMEOUT_MAX
常量的值,您將得到一個OverflowError
。
threading
模塊對象
除了上面指定的功能之外,threading
模塊還提供了許多類,這些類的對象在創建和管理線程時非常有用。
以下是一些對象類型:
| 目標 | 描述 | | 線 | 對象,表示單個執行線程。 | | 鎖 | 原始鎖對象。 | | 斷續器 | RLock 或可重入鎖對象為單線程提供了獲取(重)已持有鎖(遞歸鎖)的能力。 | | 情況 | 條件變量對象使一個線程等待,直到另一個線程滿足某個“條件”(如狀態變化或某些數據值) | | 事件 | 這是條件變量的一個更通用的版本,可以讓許多線程等待某個事件的發生,所有等待的線程只有在事件發生時才會被喚醒。 | | 旗語 | 當線程塊之間共享的有限資源不可用時,提供一個“計數器”。 | | 有界符號 | 類似于信號量,但確保它永遠不會超過初始值。 | | 計時器 | 類似于線程,除了它在運行之前等待一段指定的時間。 | | 屏障 | 創建一個“屏障”,指定數量的線程必須全部到達該屏障,然后才能繼續運行。 |
上表簡要介紹了 python threading
模塊中的各種對象類型。我們將在接下來的幾個教程中詳細討論所有這些對象。