python中ThreadLocal的理解与使用
一、对 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的理解与使用相关推荐
- python中result的用法_关于Python中的列表理解及用法
在Python中,列表理解通常用于编写单行语句,这些语句通过可迭代对象进行迭代以创建新的列表或字典.本文首先介绍for循环如何在Python中工作,然后解释如何在Python中使用列表理解. Pyth ...
- python中raw是什么意思_对于Python中RawString的理解
对于Python中RawString的理解 发布于 2016-01-11 06:56:27 | 100 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对 ...
- 对python中axis的理解
对 p y t h o n 中 a x i s 的 理 解 对python中axis的理解 对python中axis的理解 axis的实际含义是根据axis指定的维度进行连接,如矩阵m1的维度为(2, ...
- python yield理解_对Python中Yield的理解
看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来. 要说yield首先要说python中的生成器,那么什么是生成器? 假设有 ...
- python中元组_理解python中的元组
理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...
- python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化
我正在努力提高我对python中hanoi之塔递归解决方案代码的理解. 此代码:def moveTower(height,fromPole, toPole, withPole): if height ...
- python中__init__方法_关于python中__init__方法理解
在理解__init__方法之前,我们需要搞明白,什么时候才需要用到的这个方法 什么是__init__? __init__方法在python中是类的初始化,通俗来讲,就是每次只要你去创建一个类的实例对象 ...
- python中metaclass的理解
metaclass --元类, 为描述类的超类,同时可以改变子类的形态.metaclass就是Python中用来创建class object的class.我们可以将其看做能够产生class的类工厂. ...
- python中的列表理解_掌握『Python列表理解』需要知道的9件事,你知道了吗?
越来越多的人开始学习Python,它已经成为最流行的编程语言之一,这几乎发生在所有领域.比如网络开发.科学计算,当然还有人工智能. 无论想用python干什么,都绕不开学习Python的数据结构.变量 ...
最新文章
- java 规范异常的处理_规范-异常处理
- 正文处理命令及tar命令
- Java并发编程--CountDownLatch
- Elasticsearch未授权访问+Kibana任意操作
- 国产操作系统发展离不开人才和市场
- 论文浅尝 | 用增强学习进行推理:问答与知识库完善(KBC)
- C++ 空指针和野指针
- Oracle拆分字符串,字符串分割的函数。
- 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)...
- jep3.5 java 动态公式
- 微信小程序图标在真机调试时加载不出来
- PREEvision软件-汽车电子电气架构的开发工具
- frp内网穿透疑难杂症【1】do http proxy request [host:www.xxx.xxx] error: no root found: www.xxx.xxx
- Win10电脑下载软件有绑定软件怎么删除
- 麦弗逊悬架硬点布置 根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标
- 内存小实用的手机浏览器,这2款无广告,功能不输UC
- (数据科学学习手札32)Python中re模块的详细介绍
- win10自动修复无法关闭的解决方案
- 苹果电脑怎么用c语言编程,mac电脑怎么调试c语言
- 前端发起接口请求时报错:405 Method Not Allowed
热门文章
- oraToolKit Oracle安装辅助工具的使用方法
- Python Module_openpyxl_处理Excel表格
- Keil工程Lib库文件的制作和运用
- java节假日api--关于节假日想到的
- Confluence 6 管理协同编辑
- 解决:Reading table information for completion of table and column names
- 突然关机导致git文件受损,如何处理
- (2)JavaScript数据类型
- android api (83) —— InputMethodSession [输入法]
- ORACLE告警日志文件