_thread — 低级线程 API — Python 文档

来自菜鸟教程
Python/docs/3.9/library/ thread
跳转至:导航、​搜索

_thread — 低级线程 API


该模块提供用于处理多线程(也称为 轻量级进程任务 )的低级原语——多个控制线程共享其全局数据空间。 对于同步,提供了简单的锁(也称为 互斥锁二进制信号量 )。 threading 模块提供了一个更易于使用的高级线程 API,该 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 异常时,它会被静默忽略。

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

_thread.interrupt_main()

模拟一个 signal.SIGINT 信号到达主线程的效果。 一个线程可以使用这个函数来中断主线程。

如果 signal.SIGINT 没有被 Python 处理(它被设置为 signal.SIG_DFLsignal.SIG_IGN),这个函数什么都不做。

_thread.exit()
引发 SystemExit 异常。 如果没有被捕获,这将导致线程静默退出。
_thread.allocate_lock()
返回一个新的锁对象。 下面描述了锁的方法。 锁最初是解锁的。
_thread.get_ident()
返回当前线程的“线程标识符”。 这是一个非零整数。 它的价值没有直接的意义; 它旨在用作魔术饼干,例如 索引线程特定数据的字典。 当一个线程退出并创建另一个线程时,线程标识符可能会被回收。
_thread.get_native_id()

返回内核分配的当前线程的本机整数线程 ID。 这是一个非负整数。 它的值可用于在系统范围内唯一标识此特定线程(直到线程终止,之后该值可由操作系统回收)。

3.8 版中的新功能。

_thread.stack_size([size])
返回创建新线程时使用的线程堆栈大小。 可选的 size 参数指定用于后续创建的线程的堆栈大小,并且必须为 0(使用平台或配置的默认值)或至少为 32,768 (32 KiB) 的正整数值。 如果未指定 size,则使用 0。 如果不支持更改线程堆栈大小,则会引发 RuntimeError。 如果指定的堆栈大小无效,则会引发 ValueError 并且堆栈大小未修改。 32 KiB 目前是支持的最小堆栈大小值,以保证解释器本身有足够的堆栈空间。 请注意,某些平台可能对堆栈大小的值有特定限制,例如要求最小堆栈大小 > 32 KiB 或要求以系统内存页面大小的倍数进行分配 - 应参考平台文档以获取更多信息(4 KiB 页很常见;如果没有更具体的信息,建议使用 4096 的倍数作为堆栈大小)。
_thread.TIMEOUT_MAX

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

3.2 版中的新功能。

锁对象有以下方法:

lock.acquire(waitflag=1, timeout=- 1)

在没有任何可选参数的情况下,此方法无条件地获取锁,如有必要,等待它被另一个线程释放(一次只有一个线程可以获取锁——这就是它们存在的原因)。

如果存在整数 waitflag 参数,则操作取决于其值:如果为零,则仅在无需等待即可立即获取时才获取锁,如果不为零,则获取锁无条件如上。

如果浮点 timeout 参数存在且为正,则它指定返回前的最大等待时间(以秒为单位)。 负 timeout 参数指定无限等待。 如果 waitflag 为零,则不能指定 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 异常将被任意线程接收。 (当 signal 模块可用时,中断总是转到主线程。)
  • 调用 sys.exit() 或引发 SystemExit 异常相当于调用 _thread.exit()
  • 不可能在锁上中断 acquire() 方法——KeyboardInterrupt 异常将在获取锁后发生。
  • 当主线程退出时,其他线程是否存活由系统定义。 在大多数系统上,它们在不执行 try ... finally 子句或执行对象析构函数的情况下被杀死。
  • 当主线程退出时,它不会执行任何通常的清理(除了 try ... finally 子句被遵守),并且标准 I/O 文件不会被刷新。