_thread — 低级线程 API


此模块提供用于处理多个线程的低级原语 (也称 轻量进程 or tasks ) — 多个控制线程共享其全局数据空间。对于同步而言,简单锁 (也称 mutexes or 二进制信号量 ) 被提供。 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 异常,它被默默忽略。

3.8 版改变: sys.unraisablehook() 现在用于处理未处理异常。

_thread. interrupt_main ( signum = signal.SIGINT , / )

模拟信号抵达主线程的效果。线程可以使用此函数来中断主线程,尽管立即发生中断没有保证。

若给定, signum 是要模拟的信号编号。若 signum 未给定, signal.SIGINT 被模拟。

若给定信号未被 Python 所处理 (被设为 signal.SIG_DFL or signal.SIG_IGN ),此函数什么都不做。

3.10 版改变: signum 自变量被添加到定制信号编号。

注意

这不发射相应信号,但调度关联处理程序的调用 (若它存在的话)。若想要真正发射信号,使用 signal.raise_signal() .

_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、PThreads。

支持 POSIX 线程的 Unix 平台。

_thread. TIMEOUT_MAX

最大允许值为 timeout 参数对于 Lock.acquire() 。指定大于此值的超时将引发 OverflowError .

3.2 版新增。

锁对象拥有下列方法:

lock. acquire ( blocking = True , timeout = - 1 )

当没有任何可选自变量时,此方法无条件获得锁,若有必要,等待被另一线程释放 (每次仅一线程可以获得锁 — 这是它们存在的原因)。

blocking 自变量存在,动作从属其值:若它为 False,才获得锁当不用等待就可以立即获得时,若它为 True,如上无条件获得锁。

若浮点 timeout 自变量存在且为正值,指定返回前的最大等待时间 (以秒为单位)。负值 timeout 自变量指定无界等待。不可以指定 timeout if blocking 为 False。

返回值为 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 异常会被任意线程收到。(当 signal 模块可用,中断始终转到主线程)

  • 调用 sys.exit() 或引发 SystemExit 异常相当于调用 _thread.exit() .

  • 它是不可能的,中断 acquire() 方法在锁 — KeyboardInterrupt 异常将在已获得锁之后发生。

  • 当主线程退出时,系统定义其它线程是否幸存。在大多数系统,杀除它们不执行 try finally 子句或执行对象析构函数。

  • 当主线程退出时,通常不做任何清理 (除了 try finally 子句被承兑),且不刷新标准 I/O 文件。

上一话题

contextvars — 上下文变量

下一话题

网络和进程间通信

本页