python多线程之ThreadLocal 笔记

news/2025/3/3 20:22:01/

什么是ThreadLocal

ThreadLocal(线程本地存储)是多线程编程中实现线程隔离数据的机制,通过为每个线程创建独立的数据副本来避免资源竞争。Python 的 threading 模块通过 local 类实现这一特性:

  • 每个线程访问 ThreadLocal 对象时,实际访问的是与该线程 ID 绑定的独立存储空间
  • 底层通过字典结构维护 {线程ID: 私有数据}
  • 无需加锁即可实现线程安全的数据访问

使用示例

python">from threading import Thread,local
import timelocal = local()
class MyThread(Thread):def __init__(self,name,):super().__init__()self.name = namedef run(self):print("{} is running".format(self.name))# 获取当前线程的变量print(f"{self.name} 获取当前线程的变量{local.__dict__}")# 设置当前线程的变量local.name = "{}".format(self.name)print(f"{self.name} 设置当前线程后的变量{local.__dict__}")time.sleep(1)if __name__ == '__main__':# 创建一个变量local.name = "main"local.age = 18# 创建线程for i in range(3):t = MyThread(i)t.start()print(f"main is {local.__dict__}")

输出:

python">0 is running
0 获取当前线程的变量{}
0 设置当前线程后的变量{'name': '0'}
1 is running
1 获取当前线程的变量{}
1 设置当前线程后的变量{'name': '1'}
2 is running
main is {'name': 'main', 'age': 18}
2 获取当前线程的变量{}
2 设置当前线程后的变量{'name': '2'}进程已结束,退出代码为 0

总结:

根据示例可以看到,每个线程的 Local 都是线程私有的,互不影响。

与Java中的ThreadLocal 对比

相同点:都是保证每个线程之间的数据是线程私有的,相互隔离。
不同点:主要是体现在实现的细节上。如下面表格所示:

特性PythonJava
实现机制基于线程ID的字典映射Thread对象维护内部Map
垃圾回收自动清理线程退出后的数据需手动调用remove()
协程支持需使用contextvarsJava 19之前无原生支持,Java 19之后支持虚拟线程(协程的一种实现)
继承性子线程不继承父线程数据InheritableThreadLocal
泛型支持动态类型强类型泛型

注意:以上是根据我自己的了解进行总结的,如果有不对的地方,还请道友指出。谢谢


http://www.ppmy.cn/news/1576370.html

相关文章

【Linux网络#10】:Https协议原理

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 生活总是不会一帆风顺&#xf…

深入探讨Ceph:分布式存储架构的未来

在数字化浪潮汹涌澎湃的当下,数据量呈爆发式增长,传统存储系统在应对海量数据存储、高并发访问以及灵活扩展等方面,逐渐显得力不从心。分布式存储技术应运而生,成为解决现代数据存储难题的关键方案 ,而 Ceph 作为分布式…

青少年编程与数学 02-010 C++程序设计基础 14课题、控制结构

青少年编程与数学 02-010 C程序设计基础 14课题、控制结构 一、顺序结构(一)概念(二)示例 二、选择结构(一)概念(二)if语句(三)if - else语句(四&…

c# 代码规范

在C#编程中,遵循良好的命名规范是提高代码可读性和可维护性的关键。C# 社区普遍接受一套命名约定,这些约定有助于团队成员之间更好地协作,同时也便于其他开发者阅读和理解你的代码。以下是一些基本的C#命名规范: 在C#编程中&…

Java GC 基础知识快速回顾

目录 一、Java 垃圾回收(GC)基本概念和重要性分析 (一) Java 垃圾回收(GC)基本概念回顾 1.GC 三种常见语义 2.Mutator:应用程序的内存管理角色 3.TLAB(线程本地分配缓存&#x…

系统架构设计师—计算机基础篇—系统性能评价

文章目录 性能评价指标主频CPU时钟周期机器周期CPIMIPS 系统性能调整阿姆达尔解决方案性能优化数据库应用系统Web应用系统 性能评估方法评价程序真实程序基准测试程序核心程序小型基准程序合成基准程序 基准测试程序组 评测准确度 性能指标计算机数据库应用系统Web应用系统 性能…

判断按键盘是否好使的开机自启动PowerShell脚本

一、ps1脚本 文件名:KeyboardCheck.ps1 Function WaitForKeyPress($TimeoutInSeconds) {$KeyPressed $false$deadline (Get-Date).AddSeconds($TimeoutInSeconds)# 显示提示信息Write-Host "请在 $TimeoutInSeconds 秒内按下任意键(长时间没有检测到按下按…