2020.10.6 ThreadLocal

在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量要好,因为局部变量不会被其他线程改变。

 

但是局部变量也存在问题——在函数调用的时候,传递起来很麻烦:

复制代码
def process_student(name):
    std=Student(name)
    #std是局部变量,但是每个函数都要使用它,因此要传进去
    do_task_1(std)
    do_task_2(std)

def do_task_1(std):
    do_subtask_1(std)
    do_subtask_2(std)

def do_task_2(std):
    do_subtask_2(std)
    do_subtask_2(std)
复制代码

每个函数都要一层一层地传递最上层的局部变量。

 

解决方法:

ThreadLocal

复制代码
import threading
from Student import Student
#创建全局ThreadLocal对象
local_school=threading.local()

def process_student():
    #获取当前线程关联的Student
    std=local_school.Student
    print('Hello ,%s (in %s)'%(std,threading.current_thread().name))

def process_thread(name):
    #绑定ThreadLocal的Student
    local_school.Student=name
    process_student()

t1=threading.Thread(target=process_thread,args=('Alice',),name='Thread-A')
t2=threading.Thread(target=process_thread,args=('Bob',),name='Thread=B')
t1.start()
t2.start()
t1.join()
t2.join()
复制代码

执行结果:

Hello ,Alice (in Thread-A)
Hello ,Bob (in Thread=B)

全局变量local_school是一个ThreadLocal对象,每个Thread都可以读写其Student属性,但互不影响。可以把local_school视为全局变量,而其每个属性例如local_school.Student都是线程的局部变量,可以任意读写而不互相干扰,也不用管理锁的问题,ThreadLocal内部会自己处理。

另外,绑定的变量不一定必须是Student,也可以是Teacher……

 

ThreadLocal最常用的地方是为每一个线程绑定一个数据库连接,HTTP请求,用户身份信息,这样一个线程的所有调用到的处理函数都可以很方便地访问这些资源。

posted @   ShineLe  阅读(54)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示