_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_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 上透過訊號中斷鎖的獲取。

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 子句或執行物件解構函式。