一、对 ThreadLocal 的理解

  ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样。   ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以访问自己内部的副本变量。

二、为什么会出现 ThreadLocal 的技术应用

  我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。如果一个线程对全局变量进行了修改,将会影响到其他所有的线程对全局变量的计算操作,从而出现数据混乱,即为脏数据。为了避免逗哥线程同时对变量进行修改,引入了线程同步机制,通过互斥锁、条件变量或者读写锁来控制对全局变量的访问。

  只用全局变量并不能满足多线程环境的需求,很多时候线程还需要拥有自己的私有数据,这些数据对于其他线程来说是不可见的。因此线程中也可以使用局部变量,局部变量只有线程自身可以访问,同一个进程下的其他线程不可访问。

  有时候使用局部变量不太方便,因此 Python 还提供了ThreadLocal 变量,它本身是一个全局变量,但是每个线程却可以利用它来保存属于自己的私有数据,这些私有数据对其他线程也是不可见的。

  ThreadLocal 真正做到了线程之间的数据隔离。

三、代码如下:

 1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-3 # ThreadLocal code4 5 import threading6 7 NUM = 08 local = threading.loacl()9
10
11 def run(x, n):
12     x = x + n
13     x = x - n
14
15
16 def func(n):
17     local.x = NUM  # 将全局变量赋值给一个线程要执行的函数的局部变量。
18     for i in range(1000000):
19         run(local.x, n)
20     print('%s-%d' % (threading.current_thread().name, local.x))
21
22
23 if __name__ == '__main__':
24     t1 = threading.Thread(target=func, args=(6,))
25     t2 = threading.Thread(target=func, args=(9,))
26     t1.start()
27     t2.start()
28     t1.join()
29     t2.join()
30     print('NUM = ', NUM)

  上面的示例中每一个线程都可以通过 local.x 获取自己独有的数据,并且每个线程读取到的loacl.x 都不同,真正做到线程之间的隔离。

python中ThreadLocal的理解与使用相关推荐

  1. python中result的用法_关于Python中的列表理解及用法

    在Python中,列表理解通常用于编写单行语句,这些语句通过可迭代对象进行迭代以创建新的列表或字典.本文首先介绍for循环如何在Python中工作,然后解释如何在Python中使用列表理解. Pyth ...

  2. python中raw是什么意思_对于Python中RawString的理解

    对于Python中RawString的理解 发布于 2016-01-11 06:56:27 | 100 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对 ...

  3. 对python中axis的理解

    对 p y t h o n 中 a x i s 的 理 解 对python中axis的理解 对python中axis的理解 axis的实际含义是根据axis指定的维度进行连接,如矩阵m1的维度为(2, ...

  4. python yield理解_对Python中Yield的理解

    看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来. 要说yield首先要说python中的生成器,那么什么是生成器? 假设有 ...

  5. python中元组_理解python中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  6. python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化

    我正在努力提高我对python中hanoi之塔递归解决方案代码的理解. 此代码:def moveTower(height,fromPole, toPole, withPole): if height ...

  7. python中__init__方法_关于python中__init__方法理解

    在理解__init__方法之前,我们需要搞明白,什么时候才需要用到的这个方法 什么是__init__? __init__方法在python中是类的初始化,通俗来讲,就是每次只要你去创建一个类的实例对象 ...

  8. python中metaclass的理解

    metaclass --元类, 为描述类的超类,同时可以改变子类的形态.metaclass就是Python中用来创建class object的class.我们可以将其看做能够产生class的类工厂. ...

  9. python中的列表理解_掌握『Python列表理解』需要知道的9件事,你知道了吗?

    越来越多的人开始学习Python,它已经成为最流行的编程语言之一,这几乎发生在所有领域.比如网络开发.科学计算,当然还有人工智能. 无论想用python干什么,都绕不开学习Python的数据结构.变量 ...

最新文章

  1. java 规范异常的处理_规范-异常处理
  2. 正文处理命令及tar命令
  3. Java并发编程--CountDownLatch
  4. Elasticsearch未授权访问+Kibana任意操作
  5. 国产操作系统发展离不开人才和市场
  6. 论文浅尝 | 用增强学习进行推理:问答与知识库完善(KBC)
  7. C++ 空指针和野指针
  8. Oracle拆分字符串,字符串分割的函数。
  9. 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)...
  10. jep3.5 java 动态公式
  11. 微信小程序图标在真机调试时加载不出来
  12. PREEvision软件-汽车电子电气架构的开发工具
  13. frp内网穿透疑难杂症【1】do http proxy request [host:www.xxx.xxx] error: no root found: www.xxx.xxx
  14. Win10电脑下载软件有绑定软件怎么删除
  15. 麦弗逊悬架硬点布置 根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标
  16. 内存小实用的手机浏览器,这2款无广告,功能不输UC
  17. (数据科学学习手札32)Python中re模块的详细介绍
  18. win10自动修复无法关闭的解决方案
  19. 苹果电脑怎么用c语言编程,mac电脑怎么调试c语言
  20. 前端发起接口请求时报错:405 Method Not Allowed

热门文章

  1. oraToolKit Oracle安装辅助工具的使用方法
  2. Python Module_openpyxl_处理Excel表格
  3. Keil工程Lib库文件的制作和运用
  4. java节假日api--关于节假日想到的
  5. Confluence 6 管理协同编辑
  6. 解决:Reading table information for completion of table and column names
  7. 突然关机导致git文件受损,如何处理
  8. (2)JavaScript数据类型
  9. android api (83) —— InputMethodSession [输入法]
  10. ORACLE告警日志文件