_thread
— 底層執行緒 API¶
此模組提供了用於處理多個執行緒(也稱為 輕量級程序 或 任務)的底層原語 — 多個控制執行緒共享其全域性資料空間。為了實現同步,提供了簡單的鎖(也稱為 互斥鎖 或 二進位制訊號量)。threading
模組在些模組之上構建了一個更易於使用和更高階的執行緒 API。
在 3.7 版本發生變更: 該模組曾經是可選的,現在總是可用。
該模組定義了下列常量和函式:
- exception _thread.error¶
線上程特定錯誤時引發。
在 3.3 版本發生變更: 現在是內建
RuntimeError
的同義詞。
- _thread.LockType¶
這是鎖物件的型別。
- _thread.start_new_thread(function, args[, kwargs])¶
啟動一個新執行緒並返回其識別符號。執行緒執行函式 function 並附帶引數列表 args(必須是元組)。可選的 kwargs 引數指定一個關鍵字引數字典。
當函式返回時,執行緒會靜默地退出。
當函式因未處理的異常而終止時,將呼叫
sys.unraisablehook()
來處理該異常。鉤子引數的 object 屬性是 function。預設情況下,會列印堆疊回溯,然後執行緒退出(但其他執行緒會繼續執行)。當函式引發
SystemExit
異常時,它會被靜默地忽略。引發一個 審計事件
_thread.start_new_thread
,附帶引數function
,args
,kwargs
。在 3.8 版本發生變更: 現在使用
sys.unraisablehook()
來處理未處理的異常。
- _thread.interrupt_main(signum=signal.SIGINT, /)¶
模擬在主執行緒中接收到訊號的效果。一個執行緒可以使用此函式來中斷主執行緒,但不能保證中斷會立即發生。
如果給出 signum,則為要模擬的訊號編號。如果未給出 signum,則模擬
signal.SIGINT
。如果給定的訊號未被 Python 處理(即它被設定為
signal.SIG_DFL
或signal.SIG_IGN
),此函式將不執行任何操作。在 3.10 版本發生變更: 新增 signum 引數以自定義訊號編號。
備註
這不會發出相應的訊號,而是安排呼叫相關的處理程式(如果存在)。如果你想真正地發出訊號,請使用
signal.raise_signal()
。
- _thread.exit()¶
引發
SystemExit
異常。當未被捕獲時,這將導致執行緒靜默地退出。
- _thread.allocate_lock()¶
返回一個新的鎖物件。鎖的方法將在下面描述。鎖最初處於未鎖定狀態。
- _thread.get_ident()¶
返回當前執行緒的“執行緒識別符號”。這是一個非零整數。它的值沒有直接含義;它旨在用作一個魔術 cookie,例如用於索引一個執行緒特定資料的字典。當一個執行緒退出並建立另一個執行緒時,執行緒識別符號可能會被回收。
- _thread.get_native_id()¶
返回由核心分配的當前執行緒的原生整數執行緒 ID。這是一個非負整數。它的值可用於在系統範圍內唯一地標識這個特定的執行緒(直到執行緒終止,之後該值可能會被作業系統回收)。
可用性: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.
在 3.8 版本加入。
在 3.13 版本發生變更: 增加了對 GNU/kFreeBSD 的支援。
- _thread.stack_size([size])¶
返回建立新執行緒時使用的執行緒堆疊大小。可選的 size 引數指定了後續建立執行緒時要使用的堆疊大小,必須是 0(使用平臺或配置的預設值)或一個至少為 32,768 (32 KiB) 的正整數值。如果未指定 size,則使用 0。如果不支援更改執行緒堆疊大小,則會引發
RuntimeError
。如果指定的堆疊大小無效,則會引發ValueError
並且堆疊大小不會被修改。32 KiB 是目前支援的最小堆疊大小值,以保證直譯器本身有足夠的堆疊空間。請注意,某些平臺可能對堆疊大小的值有特殊限制,例如要求最小堆疊大小 > 32 KiB 或要求按系統記憶體頁大小的倍數進行分配 — 應參考平臺文件以獲取更多資訊(4 KiB 頁面很常見;在沒有更具體資訊的情況下,建議使用 4096 的倍數作為堆疊大小)。可用性: Windows, pthreads。
支援 POSIX 執行緒的 Unix 平臺。
- _thread.TIMEOUT_MAX¶
Lock.acquire
的 timeout 引數允許的最大值。指定大於此值的超時將引發OverflowError
。在 3.2 版本加入。
鎖物件有以下方法:
- lock.acquire(blocking=True, timeout=-1)¶
不帶任何可選引數時,此方法無條件地獲取鎖,必要時會等待直到它被另一個執行緒釋放(同一時間只有一個執行緒可以獲取鎖 — 這就是它們存在的理由)。
如果存在 blocking 引數,則操作取決於其值:如果為 false,則僅當可以立即獲取鎖而無需等待時才獲取鎖;如果為 true,則如上所述無條件地獲取鎖。
如果存在浮點數 timeout 引數且為正數,它指定了返回前最長的等待時間(秒)。負的 timeout 引數指定了無限期等待。如果 blocking 為 false,則不能指定 timeout。
如果成功獲取鎖,返回值為
True
,否則為False
。在 3.2 版本發生變更: 新增 timeout 引數。
在 3.2 版本發生變更: 在 POSIX 上,鎖的獲取現在可以被訊號中斷。
在 3.14 版本發生變更: 在 Windows 上,鎖的獲取現在可以被訊號中斷。
- lock.release()¶
釋放鎖。鎖必須是先前已經獲取的,但不一定是由同一個執行緒獲取。
- lock.locked()¶
返回鎖的狀態:如果已被某個執行緒獲取,則為
True
,否則為False
。
除了這些方法,鎖物件還可以透過 with
語句使用,例如:
import _thread
a_lock = _thread.allocate_lock()
with a_lock:
print("a_lock is locked while this executes")
注意事項
中斷總是傳送到主執行緒(
KeyboardInterrupt
異常將由該執行緒接收)。呼叫
sys.exit()
或引發SystemExit
異常等同於呼叫_thread.exit()
。當主執行緒退出時,其他執行緒是否存活是由系統定義的。在大多數系統上,它們會被殺死,而不會執行
try
...finally
子句或執行物件解構函式。