主页 > 其他  > 

python多线程之ThreadLocal笔记

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

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

标签:

python多线程之ThreadLocal笔记由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“python多线程之ThreadLocal笔记