_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_DFLsignal.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.acquiretimeout 引數允許的最大值。指定大於此值的超時將引發 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 子句或執行物件解構函式。