_thread
— 低级线程 API
¶
此模块提供用于处理多个线程的低级原语 (也称
轻量进程
or
tasks
) — 多个控制线程共享其全局数据空间。对于同步而言,简单锁 (也称
mutexes
or
二进制信号量
) 被提供。
threading
模块提供构建于此模块之上,更易于使用且更高级的线程 API。
3.7 版改变: 此模块曾经是可选的,现在始终可用。
此模块定义以下常量和函数:
_thread.
error
¶
引发特定线程错误。
3.3 版改变:
这现在是同义词内置
RuntimeError
.
_thread.
LockType
¶
这是锁对象的类型。
_thread.
start_new_thread
(
function
,
args
[
,
kwargs
]
)
¶
启动新线程并返回其标识符。线程执行函数 function 采用自变量列表 args (其必须是元组)。可选 kwargs 自变量指定关键词自变量字典。
当函数返回时,线程默默退出。
当函数以未处理异常终止时,
sys.unraisablehook()
被调用以处理异常。
object
属性对于挂钩自变量是
function
。默认情况下,打印堆栈跟踪,然后退出线程 (但其它线程继续运行)。
当函数引发
SystemExit
异常,它被默默忽略。
3.8 版改变:
sys.unraisablehook()
现在用于处理未处理异常。
_thread.
interrupt_main
(
)
¶
模拟效果为
signal.SIGINT
信号当抵达主线程。线程可以使用此函数来中断主线程。
若
signal.SIGINT
未被 Python 所处理 (被设为
signal.SIG_DFL
or
signal.SIG_IGN
),此函数什么都不做。
_thread.
exit
(
)
¶
引发
SystemExit
异常。若未被捕获,这将导致线程默默退出。
_thread.
allocate_lock
(
)
¶
返回新的锁对象。锁方法的描述如下。锁最初是解锁的。
_thread.
get_ident
(
)
¶
返回当前线程的 "线程标识符"。这是非 0 整数。它的值没有直接意义;旨在作为魔法 Cookie 使用 (如:索引特定线程数据的字典)。线程标识符会被回收,当退出线程并创建另一线程时。
_thread.
get_native_id
(
)
¶
返回由内核赋值的当前线程的本机整形线程 ID。这是非负整数。可以使用它的值唯一标识系统范围内的此特定线程 (直到线程终止,之后 OS 会回收该值)。
可用性 :Windows、FreeBSD、Linux、macOS、OpenBSD、NetBSD、AIX。
3.8 版新增。
_thread.
stack_size
(
[
size
]
)
¶
返回创建新线程时使用的线程堆栈大小。可选
size
自变量指定用于随后创建线程的堆栈大小,且必须为 0 (使用平台或配置默认的) 或至少 32,768 (32 KB) 的正整数值。若
size
未指定,使用 0。若不支持改变线程堆栈大小,
RuntimeError
被引发。若指定堆栈大小无效,
ValueError
被引发且未修改堆栈大小。32 KB 是目前支持的最小堆栈大小值,以保证解释器本身堆栈空间足够。注意,某些平台可能对堆栈大小值有特定限制,譬如要求最小堆栈大小 > 32KB 或要求按系统内存页面大小的倍数分配 - 要了解更多信息请参考平台文档编制 (4KB 页面很常见;建议堆栈大小使用 4096 的倍数方式,当缺乏更具体信息时)。
可用性 :Windows、带有 POSIX 线程的系统。
_thread.
TIMEOUT_MAX
¶
最大允许值为
timeout
参数对于
Lock.acquire()
。指定大于此值的超时将引发
OverflowError
.
3.2 版新增。
锁对象拥有下列方法:
lock.
acquire
(
waitflag=1
,
timeout=-1
)
¶
当没有任何可选自变量时,此方法无条件获得锁,若有必要,等待被另一线程释放 (每次仅一线程可以获得锁 — 这是它们存在的原因)。
若整数 waitflag 自变量存在,动作从属其值:若它为 0,才获得锁当不用等待就可以立即获得时,若它为非 0,如上无条件获得锁。
若浮点 timeout 自变量存在且为正值,指定返回前的最大等待时间 (以秒为单位)。负值 timeout 自变量指定无界等待。不可以指定 timeout if waitflag 为 0。
返回值为
True
若成功获取锁,
False
若不。
3.2 版改变: The 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
异常会被任意线程收到。(当
signal
模块可用,中断始终转到主线程)
调用
sys.exit()
或引发
SystemExit
异常相当于调用
_thread.exit()
.
它是不可能的,中断
acquire()
方法在锁 —
KeyboardInterrupt
异常将在已获得锁之后发生。
当主线程退出时,系统定义其它线程是否幸存。在大多数系统,杀除它们不执行
try
…
finally
子句或执行对象析构函数。