​_thread --- 底层多线程 API​

news/2024/7/3 3:35:41


该模块提供了操作多个线程(也被称为 轻量级进程 或 任务)的底层原语 —— 多个控制线程共享全局数据空间。为了处理同步问题,也提供了简单的锁机制(也称为 互斥锁 或 二进制信号)。threading 模块基于该模块提供了更易用的高级多线程 API。

在 3.7 版更改: 这个模块曾经为可选项,但现在总是可用。

这个模块定义了以下常量和函数:

exception _thread.error

发生线程相关错误时抛出。

在 3.3 版更改: 现在是内建异常 RuntimeError 的别名。

_thread.LockType

锁对象的类型。

_thread.start_new_thread(functionargs[, kwargs])

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

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

当函数因某个未处理异常而终结时,sys.unraisablehook() 会被调用以处理异常。 钩子参数的 object 属性为 function。 在默认情况下,会打印堆栈回溯然后该线程将退出(但其他线程会继续运行)。

当函数引发 SystemExit 异常时,它会被静默地忽略。

引发一个 审计事件 _thread.start_new_thread,附带参数 functionargskwargs

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

_thread.interrupt_main(signum=signal.SIGINT/)

模拟一个信号到达主线程的效果。 线程可使用此函数来打断主线程,虽然并不保证打断将立即发生。

如果给出 signum,则表示要模拟的信号的编号。 如果未给出 signum,则将模拟 signal.SIGINT。

如果给出的信号未被 Python 处理 (它被设为 signal.SIG_DFL 或 signal.SIG_IGN),则此函数将不做任何操作。

在 3.10 版更改: 添加了 signum 参数来定制信号的编号。

备注

这并不会发出对应的信号而是将一个调用排入关联处理句柄的计划任务(如果句柄存在的话)。 如果你想要真的发出信号,请使用 signal.raise_signal()。

_thread.exit()

抛出 SystemExit 异常。如果没有捕获的话,这个异常会使线程退出。

_thread.allocate_lock()

返回一个新的锁对象。锁中的方法在后面描述。初始情况下锁处于解锁状态。

_thread.get_ident()

返回当前线程的 “线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。

_thread.get_native_id()

返回内核分配给当前线程的原生集成线程 ID。 这是一个非负整数。 它的值可被用来在整个系统中唯一地标识这个特定线程(直到线程终结,在那之后该值可能会被 OS 回收再利用)。

可用性: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD。

3.8 新版功能.

_thread.stack_size([size])

返回创建线程时使用的堆栈大小。可选参数 size 指定之后新建的线程的堆栈大小,而且一定要是0(根据平台或者默认配置)或者最小是32,768(32KiB)的一个正整数。如果 size 没有指定,默认是0。如果不支持改变线程堆栈大小,会抛出 RuntimeError 错误。如果指定的堆栈大小不合法,会抛出 ValueError 错误并且不会修改堆栈大小。32KiB是当前最小的能保证解释器有足够堆栈空间的堆栈大小。需要注意的是部分平台对于堆栈大小会有特定的限制,例如要求大于32KiB的堆栈大小或者需要根据系统内存页面的整数倍进行分配 - 应当查阅平台文档有关详细信息(4KiB页面比较普遍,在没有更具体信息的情况下,建议的方法是使用4096的倍数作为堆栈大小)。

可用性: Windows, pthreads。

带有 POSIX 线程支持的 Unix 平台。

_thread.TIMEOUT_MAX

Lock.acquire 的 timeout 形参所允许的最大值。 指定大于该值的 timeout 将引发 OverflowError。

3.2 新版功能.

锁对象有以下方法:

lock.acquire(blocking=Truetimeout=- 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 异常可能会被任意一个线程捕获。(如果 signal 模块可用的话,中断总是会进入主线程。)

  • 调用 sys.exit() 或是抛出 SystemExit 异常等效于调用 _thread.exit()。

  • 不可能中断锁上的 acquire() 方法 --- KeyboardInterrupt 异常将在获取锁之后发生。

  • 当主线程退出时,由系统决定其他线程是否存活。在大多数系统中,这些线程会直接被杀掉,不会执行 try ... finally 语句,也不会执行对象析构函数。

  • 当主线程退出时,不会进行正常的清理工作(除非使用了 try ... finally 语句),标准 I/O 文件也不会刷新。


http://lihuaxi.xjx100.cn/news/1892435.html

相关文章

高品质旋转花键的选型要素

旋转花键是一种常见的传动元件,用于实现旋转运动的传递;但旋转花键的技术参数可能因不同制造商和产品型号而有所差异,那如何进行旋转花键的选型呢? 1、明确应用需求,旋转花键适用于各种类型的机械传动系统,…

【读书笔记】我在北京送快递-胡安焉

【读书笔记】 我在北京送快递 胡安焉 83个笔记 第一章 我在物流公司上夜班的一年 高级的写字楼里面,可能是各种996,各种离谱到家的项目。 不过我是在离开后,才从网上了解到这一点的;当我还在那里上班时,虽然也为它的…

智能优化算法应用:基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MA…

Python全局变量示例用法

Python全局变量示例用法:在函数体内定义全局变量。即使用global 关键字对变量进行修饰后,该变量就会变为全局变量。 # Author : 小红牛 # 微信公众号:WdPython # 定义全局变量 x 10 y 20print(1.在函数外,打印全局变量xy的值.c…

QT之QTransform

QT之QTransform 成员函数例程 成员函数 QTransform函数: translate(x,y):平移。 rotate(a):旋转(a为角度值)。 scale(sx,sy):缩放。 shear(shx,shy):斜切。 setMatrix(m11,m12,m21,m22,dx,dy)&…

图生视频AI技术,1张图零提示词,让静态照片动起来

AI时代的发展速度比我们想象中的快多了,当大部分人刚学会AI生成图片时,现在又开始流行AI生成视频了,正式从图片、文字升级到短视频时代。 最近一段时间,AI生成视频的技术正在突飞猛进。Pika、Runway等大家熟知的海外工具都在不断…

解决程序员单元测试效率问题,AI是助力神器

我们说了很久的AI智能,那到底作为一种智能化的工具能给我们带来什么样的帮助呢? 今天我就从一名程序员的角度来分析一下,实际上AI到底能解决我们什么问题? 首先介绍一下单测,单侧的全称叫做单元测试。就是我们在写完…

数据结构(超详细讲解!!)第二十七节 查找

1.查找的基本概念 1、查找表——由同一类型的数据元素(或记录)构成的集合称为查找表。 2、对查找表进行的操作: 查找某个特定的数据元素是否存在; 检索某个特定数据元素的属性; 在查找表中插入一个数据元素&#x…