_thread
— 底層執行緒 API¶
此模組為使用多執行緒(也稱為輕量級程序或任務)提供了底層原語 - 共享其全域性資料空間的多個控制執行緒。 為了同步,提供了簡單的鎖(也稱為互斥鎖或二進位制訊號量)。 threading
模組在此模組之上構建,提供了更易於使用和更高階的執行緒 API。
在 3.7 版本中變更: 此模組以前是可選的,現在始終可用。
此模組定義了以下常量和函式
- exception _thread.error¶
在特定於執行緒的錯誤時引發。
在 3.3 版本中變更: 現在它是內建的
RuntimeError
的同義詞。
- _thread.LockType¶
這是鎖物件的型別。
- _thread.start_new_thread(function, args[, kwargs])¶
啟動一個新執行緒並返回其識別符號。該執行緒使用引數列表 args (必須是元組)執行函式 function。 可選的 kwargs 引數指定關鍵字引數的字典。
當函式返回時,該執行緒會靜默退出。
當函式因未處理的異常而終止時,將呼叫
sys.unraisablehook()
來處理該異常。 鉤子引數的 object 屬性是 function 。 預設情況下,會列印堆疊跟蹤,然後執行緒退出(但其他執行緒繼續執行)。當函式引發
SystemExit
異常時,該異常將被靜默忽略。引發帶有引數
function
,args
,kwargs
的 審計事件_thread.start_new_thread
。在 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 上透過訊號中斷鎖的獲取。
- 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()
。鎖上的
acquire()
方法是否可以被中斷(以便KeyboardInterrupt
異常立即發生,而不是在鎖被獲取或操作超時後才發生),這取決於平臺。在 POSIX 上可以被中斷,但在 Windows 上則不行。當主執行緒退出時,其他執行緒是否繼續存活取決於系統定義。在大多數系統上,它們會被終止,而不會執行
try
...finally
子句或執行物件解構函式。