_thread ——低级线程API


此模块提供用于处理多个线程(也称为 light-weight processestasks )---多个控制线程共享其全局数据空间。对于同步,简单锁(也称为 mutexesbinary semaphores )提供。这个 threading 模块提供了一个更易于使用的高级线程API,它构建在模块之上。

在 3.7 版更改: 这个模块以前是可选的,现在总是可用的。

此模块定义以下常量和函数:

exception _thread.error

在线程特定错误上引发。

在 3.3 版更改: 这是内置的 RuntimeError .

_thread.LockType

这是锁定对象的类型。

_thread.start_new_thread(function, args[, kwargs])

启动一个新线程并返回其标识符。线程执行函数 功能 带参数列表 args (必须是元组)。可选 关键字参数 参数指定关键字参数的字典。

当函数返回时,线程将静默退出。

当函数以未处理的异常终止时, sys.unraisablehook() 调用以处理异常。这个 对象 hook参数的属性为 功能 . 默认情况下,将打印堆栈跟踪,然后线程退出(但其他线程将继续运行)。

当函数引发 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()

返回当前线程的“线程标识符”。这是一个非零整数。它的值没有直接的意义;它被用作一个神奇的cookie,用于索引线程特定数据的字典。当一个线程退出并创建另一个线程时,可以回收线程标识符。

_thread.get_native_id()

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

Availability :windows、freebsd、linux、macos、openbsd、netbsd、aix。

3.8 新版功能.

_thread.stack_size([size])

返回创建新线程时使用的线程堆栈大小。可选的 size 参数指定要用于后续创建的线程的堆栈大小,并且必须为0(使用平台或配置的默认值)或至少为32768(32 kib)的正整数值。如果 size 未指定,使用0。如果不支持更改线程堆栈大小,则 RuntimeError 提高了。如果指定的堆栈大小无效,则 ValueError 被引发,堆栈大小未被修改。32 kib是当前支持的最小堆栈大小值,以确保为解释器本身提供足够的堆栈空间。请注意,有些平台可能对堆栈大小的值有特定的限制,例如要求最小堆栈大小>32 kib或要求以系统内存页面大小的倍数分配-有关更多信息,应参考平台文档(通常使用4 kib页面;使用4096倍数作为堆栈大小是在缺乏更具体信息的情况下,采用GEGSTED方法)。

Availability :Windows,具有POSIX线程的系统。

_thread.TIMEOUT_MAX

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

3.2 新版功能.

锁定对象有以下方法:

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

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

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

如果浮点 timeout 参数存在且为正,它指定返回前的最大等待时间(秒)。否定的 timeout 参数指定无限等待。不能指定 timeout 如果 waitflag 是零。

返回值为 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")

Caveats:

  • 线程与中断发生奇怪的交互: KeyboardInterrupt 异常将由任意线程接收。(当 signal 模块可用,中断始终转到主线程。)

  • 调用 sys.exit() 或提高 SystemExit 异常等同于调用 _thread.exit() .

  • 无法中断 acquire() 锁具上的方法 KeyboardInterrupt 获取锁后将发生异常。

  • 当主线程退出时,系统定义其他线程是否存活。在大多数系统中,它们在没有执行的情况下被杀死 tryfinally 子句或执行对象析构函数。

  • 当主线程退出时,它不执行任何常规的清理(除了 tryfinally 满足子句),标准I/O文件不刷新。