当前位置: 首页 > news >正文

python多线程之ThreadLocal 笔记

什么是ThreadLocal

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

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

使用示例

from threading import Thread,local
import time

local = local()
class MyThread(Thread):
    def __init__(self,name,):
        super().__init__()
        self.name = name
    def 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__}")

输出:

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
泛型支持动态类型强类型泛型

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

相关文章:

  • 编程题 - 明明的随机数【JavaScript/Node.js解法】
  • 【知识】torchrun 与 torch.multiprocessing.spawn 的对比
  • python爬虫系列课程5:JavaScript语法介绍
  • 【Java】多线程篇 —— 线程池
  • 蓝桥杯 灯笼大乱斗【算法赛】
  • 设计模式之命令模式
  • Git操作指南:分支合并、回退及其他重要操作
  • json介绍、python数据和json数据的相互转换
  • GPIO概念
  • 分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测
  • js加密之延伸requestAnimationFrame
  • 【Block总结】SAFMN,空间自适应调制与局部特征增强的协同设计|即插即用
  • 面试基础 ---深入解析JDK8类加载机制
  • Python核心技术,Django学习基础入门教程(附环境安装包)
  • iOS UICollectionViewCell 点击事件自动化埋点
  • 计算机毕业设计SpringBoot+Vue.js相亲网站(源码+文档+PPT+讲解)
  • Unity中动态切换光照贴图LightProbe的方法
  • C++实现3D(EasyX)详细教程
  • DeepSeek蒸馏TinyLSTM实操指南
  • deepseek使用记录18——文化基因之文化融合
  • 上海小学生暑(寒)托班会增设开办期数、延长办班时间吗?团市委回应
  • 广东高州发生山体滑坡,造成2人遇难4人送医救治1人失联
  • 四大皆空!赛季还没结束,曼城已经吃上“散伙饭”了
  • 女生“生理期请病假要脱裤子证明”?高校回应:视频经处理后有失真等问题
  • 阿里上财年营收增6%,蒋凡:会积极投资,把更多淘宝用户转变成即时零售用户
  • 温州通报“一母亲殴打女儿致其死亡”:嫌犯已被刑拘