深入理解python中的ThreadLocal

作者:一根头发学一年 时间:2022-02-08 11:40:03 

ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。

它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也就是每个线程有自己的变量副本,互不干扰。

ThreadLocal为每个线程提供 get() 或 set() 方法来创建独立初始化的变量副本。

ThreadLocal的工作原理可以理解为:ThreadLocal变量相当于一个字典,字典的第一个key是线程id,每个线程的变量存储到自己id的字典里,结构可以想象成如下:

local = {
   131443: {  # 线程id
       "name": "线程1",  # 线程变量
       "age": 10,  # 线程变量
       "status": 1  # 线程变量
   }
}

看下面一个例子:

import threading

local = threading.local()

def func():
    print(f"id:{local.id},name:{local.name},num:{local.num}")

def run(num):
    local.id = threading.current_thread().ident
    local.name = threading.current_thread().name
    local.num = num
    func()

if __name__ == "__main__":
    t1 = threading.Thread(target=run, args=(1,))
    t2 = threading.Thread(target=run, args=(2,))

    t1.start()
    t2.start()
    t1.join()
    t2.join()

执行结果如下:

id:13022343168,name:Thread-1,num:1
id:13039132672,name:Thread-2,num:2

可以看到,在线程里,我们可以直接使用local点来获取各自的变量,每个线程的变量是隔离的。

那么ThreadLocal有什么用呢?

  • 线程间的数据隔离

  • 进行事务操作,存储线程事务信息

  • 数据库连接、Session会话管理

  • 在进行对象跨层传递时,打破层次间的约束

例如Flask中请求上下文对象,就是对ThreadLocal进一步封装,它能够存储每个请求的请求参数和其他变量,各请求线程之间数据隔离。

来源:https://blog.csdn.net/qq_43745578/article/details/129369272

标签:python,ThreadLocal
0
投稿

猜你喜欢

  • 设置SQLServer数据库中某些表为只读的多种方法分享

    2024-01-23 06:27:47
  • Django实战之用户认证(初始配置)

    2022-08-17 22:15:02
  • python实现图像随机裁剪的示例代码

    2021-06-07 07:02:57
  • Python3 全自动更新已安装的模块实现

    2022-02-26 15:54:11
  • 使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友

    2022-05-12 03:35:29
  • python控制台打印log输出重复的解决方法

    2021-02-23 04:05:17
  • 真正保险的“有属性”检测

    2010-03-28 13:25:00
  • Python3.x爬虫下载网页图片的实例讲解

    2022-11-25 23:24:07
  • 纯JS实现AJAX局部刷新功能

    2024-05-02 17:04:38
  • pandas 颠倒列顺序的两种解决方案

    2023-10-30 11:37:22
  • Win8下python3.5.1安装教程

    2021-11-15 13:14:54
  • Python-GUI wxPython之自动化数据生成器的项目实战

    2021-06-08 14:43:18
  • 详解如何管理多个Python版本和虚拟环境

    2022-09-26 05:10:46
  • 使用OpenCV为图像加水印的教程

    2022-08-17 10:24:33
  • 深入了解Python 方法之类方法 & 静态方法

    2023-07-27 04:15:37
  • python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法

    2023-05-25 23:48:29
  • dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)

    2024-04-28 09:45:40
  • 浅谈Python由__dict__和dir()引发的一些思考

    2021-10-06 06:14:10
  • pandas 两列时间相减换算为秒的方法

    2022-04-15 00:30:07
  • JavaScript中把数字转换为字符串的程序代码

    2024-05-03 15:59:46
  • asp之家 网络编程 m.aspxhome.com