[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用于提供线程相 ...
随机推荐
- Impala ODBC 安装笔记
Impala在线文档介绍了 Impala ODBC接口安装和配置 http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5 ...
- Android中XML解析,保存的三种方法
简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...
- Spark SQL with Hive
前一篇文章是Spark SQL的入门篇Spark SQL初探,介绍了一些基础知识和API,可是离我们的日常使用还似乎差了一步之遥. 终结Shark的利用有2个: 1.和Spark程序的集成有诸多限制 ...
- 【剑指Offer学习】【面试题26:复杂链表的复制】
题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...
- 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42
HOW TO TALK ABOUT WHAT GOES ON TEASER PREVIEW 一些以-ate结束的动词,通常表示: to exhaust([ig'zɔ:st] n. 排气,排气装置 v. ...
- 点击了一个link button,查看后台调用
使用F12进行监视 本身是一个linkbutton,可以看到绑定了一个JavaScript <a id="gvStaticConnection_ctl02_fresh" hr ...
- 使用cxf3.0.4搭建webservice服务需要的最精简jar包
转自:https://blog.csdn.net/w1014074794/article/details/47862163 下面是测试结果,只列出报错了的测试: 1.org.apache.catali ...
- javascript中手风琴特效
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- SQL学习——基础语句(1)
简序 1.SQL,指结构化查询语言,全称是 Structured Query Language. 2.SQL 让您可以访问和处理数据库. 3.SQL 是一种 ANSI(American Nationa ...
- Ubuntu包管理工具整理
概述 常用的包管理包含三类工具:dpkg.apt和aptitude.1 dpkg 主要是对本地的软件包进行管理,本地软件包包括已经在本地安装的软件包和已经下载但还没有安装的 deb 文件,不解决依赖关 ...