[Python]threading local 线程局部变量小測试
概念
有个概念叫做线程局部变量。一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理。可是有些变量初始化以后。我们仅仅想让他们在每一个线程中一直存在。相当于一个线程内的共享变量,线程之间又是隔离的。python
threading模块中就提供了这么一个类,叫做local。
多线程中共享变量和局部变量的差别我画两个小图。简单描写叙述下(作图能力一般。请见谅,概念性的东西大家能够google下,非常多好文章)
全局变量
线程局部变量
对照:
以下是3个小样例。各自是使用local局部变量。 全局变量, gevent中的local来看线程对变量的操作是否隔离。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# python2.7x
# author: orangelliu
# date: 2014-08-20 '''
线程本地变量 初始值定义之后,在线程中能够保持隔离性
为了做对照,分别和全局变量,gevent线程对照 线程局部变量
''' from time import sleep
from random import random
from threading import Thread, local data = local() def bar():
print 'called from %s'%data.v def foo():
data.v = str(data.v) + '.......'
bar() class T(Thread):
def run(self):
sleep(random())
data.v = self.getName()
sleep(1)
foo() T().start()
T().start()
运行结果:
called from Thread-1.......
called from Thread-2.......
[Finished in 1.6s]
能够看到每一个v仅仅在自己的线程中操作。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# python2.7x
# author: orangelliu
# date: 2014-08-20 '''
线程本地变量 初始值定义之后,在线程中能够保持隔离性
为了做对照。分别和全局变量,gevent线程对照 全局变量
'''
from time import sleep
from random import random
from threading import Thread, local #假设使用全局变量呢
def bar1():
global v
print 'calledddddd from %s'%v def foo1():
global v
v = v + '.....'
bar1() class T1(Thread):
def run(self):
global v
sleep(random())
v =self.getName()
sleep(1)
foo1() T1().start()
T1().start()
运行结果:
calledddddd from Thread-1.....
calledddddd from Thread-1..........
[Finished in 1.8s
能够看到v值在被2个线程都操作了。最后线程2仅仅是作了一个 再拼字符串的过程,由于线程1已经创建了全局变量v
#!/usr/bin/python
# -*- coding: utf-8 -*-
# python2.7x
# author: orangelliu
# date: 2014-08-20 '''
线程本地变量 初始值定义之后。在线程中能够保持隔离性
为了做对照,分别和全局变量,gevent线程对照 gevent 协程
''' import gevent
from gevent.local import local data = local() def bar():
print 'called from %s'%data.v def foo(v):
data.v = v
data.v = str(data.v) + '.......'
bar() g1 = gevent.spawn(foo, '1')
g2 = gevent.spawn(foo, '2') gevent.joinall([g1, g2])
called from 1.......
called from 2.......
[Finished in 0.1s]
类似线程的结果。
本文出自 “orangleliu笔记本”博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/38741275
[Python]threading local 线程局部变量小測试的更多相关文章
- python - threading.local
import time import threading try: # 线程和协程都可处理 import greenlet get_ident = greenlet.getcurrent except ...
- Selenium2 Python 自己主动化測试实战学习笔记(五)
7.1 自己主动化測试用例 无论是功能測试.性能測试和自己主动化測试时都须要编写測试用例,測试用例的好坏能准确的体现了測试人员的经验.能力以及对项目的深度理解. 7.1.1 手工測试用例与自己主动化測 ...
- Python进程、线程、协程
进程和线程的解释 进程(process)和线程(thread)是操作系统的基本概念,计算机的核心是CPU,它承担了所有的计算任务: 单个CPU一次只能运行一个任务,代表单个CPU总是运行一个进程,其他 ...
- Angular 2的12个经典面试问题汇总(文末附带Angular測试)
Angular作为眼下最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手.还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...
- mongodb3.0 性能測试报告 二
mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver 共6台 cpu: 单颗8核 ...
- python学习笔记——线程threading (一)
1 线程threading 1.1 基本概述 也被称为轻量级的进程. 线程是计算机多任务编程的一种方式,可以使用计算机的多核资源. 线程死应用程序中工作的最小单元 1.2 线程特点 (1)进程的创建开 ...
- python之threading.local
简述: threading.local是全局变量但是它的值却在当前调用它的线程当中 作用: 在threading module中,有一个非常特别的类local.一旦在主线程实例化了一个local,它会 ...
- [Python 多线程] threading.local类 (六)
在使用threading.local()之前,先了解一下局部变量和全局变量. 局部变量: import threading import time def worker(): x = 0 for i ...
- python使用threading获取线程函数返回值的实现方法
python使用threading获取线程函数返回值的实现方法 这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下 threading用于提供线程相 ...
随机推荐
- IntelliJ IDEA 对于generated source的处理
IntelliJ IDEA 对于generated source的处理 学习了:https://stackoverflow.com/questions/5170620/unable-to-use-in ...
- FZU Problem 1853 Number Deletion
Problem 1853 Number Deletion Accept: 80 Submit: 239 Time Limit: 1000 mSec Memory Limit : 32768 ...
- HDU 1113 Word Amalgamation (map 容器 + string容器)
http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...
- xargs用例一个
ls -a *.doc|awk -F. '{print $1}' |xargs -I {} java -jar ~/soft/jodconverter-2.2.2/lib/jodconverter-c ...
- Java-杂项: Java中Array和ArrayList区别
ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...
- Google浏览器vim命令
使用鼠标久了,手腕.肩膀依旧疼痛.偶尔逛知乎,看到有人推荐chrome浏览器的vimium插件(火狐浏览器是vimperator),安装了使用了几天,真不愧是浏览器神器,好用到想哭,而且非常容易上手. ...
- POJ 2353 DP
双向DP+记录路径. // by SiriusRen #include <stack> #include <cstdio> #include <cstring> u ...
- layui序章
layui,layer,laydate关系图,layer和laydate作为layui的独立模块存在 下载地址:layer.layui.com
- 洛谷P4015 运输问题(费用流)
题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai 个单位的货物:第 jj 个零售商店需要 b_jbj 个单位的货物. 货物供需平衡,即\sum\limits ...
- Web前端必须规避的8个误区
现在,有越来越多所谓的“教程”来帮助我们提高网站的易用性.下面收集了一些在Web开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助Web开发者更好的完善网站. 通过避免下面这些小错误 ...