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

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

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请求,用户身份信息,这样一个线程的所有调用到的处理函数都可以很方便地访问这些资源。

2020.10.6 ThreadLocal的更多相关文章

  1. XMind ZEN 2020 (10.0.2) 全平台 完美破解版(ubuntu)

    XMind ZEN 2020 (10.0.2) 全平台 完美破解版(ubuntu) https://www.ghpym.com/xmindzen.html/comment-page-8?replyto ...

  2. 2020.10.17 JZOJ 提高B组T2 导弹拦截

    2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...

  3. JZOJ 2020.10.7 提高B组反思

    JZOJ 2020.10.7 提高B组反思 T1 比较简单的一道题 跑\(k\)遍\(SPFA\) 然后全排列顺序枚举求解 TLE 60 双向存边数组没开两倍-- T2 搞出分母 分子不会求 \(n^ ...

  4. JZOJ 2020.10.6 提高B组反思

    JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...

  5. 蓝桥杯2020.10.17B组c++

    1.门牌制作 暴力即可 #include <iostream> #include<math.h> #include<string.h> #include<st ...

  6. IntelliJ IDEA 2020.2.3永久破解激活教程 - 2020.10.27

    申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除 不花钱 的方式 IDEA 2020.2 激活到 2089 年 注意:教程适 ...

  7. 2020.10.20 利用POST请求模拟登录知乎

    前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...

  8. Java多线程10:ThreadLocal的作用及使用

    ThreadLocal的作用 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到 ...

  9. day18 10.使用ThreadLocal来解决问题

    ThreadLocal是一个容器/集合,是一个Map集合.不管你跨多少层,只要你是同一个线程就可以取出来.Service和Dao是同一个线程.Service第一次调用JdbcUtils.getConn ...

随机推荐

  1. %r和%s的区别

    理解%r和%s的区别 %r会重现所表达的对象,%s会将所有转成字符串 eg1: print('i am %s years old' % 22) print('i am %r years old' % ...

  2. python 小兵(6)函数根据问题详解

    _list = []for i in range(3): def func(a): return i+a_list.append(func)for f in _list: print(f(1)) 首先 ...

  3. .NET 诞生已20周年,您的 .NET 技能是否还停留在2010 年?

    20年来,我们见证了超过上千万.NET 开发员,当前有600万.NET 开发者正在使用.NET技术构建各类解决方案.今天,IT市场对.NET 开发人员的需求达到了前所未有的程度,特别是在中国,各大公司 ...

  4. nginx开发:ngx_sprintf

    格式化参数%系列,如果误用的话,轻则输出不正确,重则nginx可能core. 1. 格式: %{格式描述}{输出类型描述}{数据类型描述} 2. 数据类型描述: V:字符串,对应ngx_str_t * ...

  5. RabbitMQ如何实现延迟队列?(转)

    什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一 ...

  6. 自定义的类实现copy操作

    1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...

  7. iOS团队代码规范

    iOS团队代码规范 工程之始可能需要的工具: 1.使用CocoaPods类库管理工具.CocoaPods安装和使用教程. 2.下载安装注释插件VVDocumenter-Xcode. 一.项目结构管理 ...

  8. 安装 mysql 8.0后;root用户在客户端连接不上

    --- mysql workbench Failed to Connect to MySQL at 10.211.55.6:3306 with user root Authentication plu ...

  9. 编译安装nginx,实现多域名 https

    一.编译安装nginx 1.1 获取源码包 [root@cetnos7 ~]#wget -O /usr/local/src/nginx-1.18.0.tar.gz http://nginx.org/d ...

  10. Spring Security 介绍

    Spring Security介绍 开源 提供企业级的安全认证和授权 Spring安全拦截器 认证管理器 认证模式 Basic HTTP 1.0中使用的认证方法,使用用户名和密码Base64编码的方式 ...