[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用于提供线程相 ...
随机推荐
- DirectX11 学习笔记10 - 用文件存储顶点布局
这节须要把顶点布局写在文件中面,为了方便.由于一大串很抽象的坐标放在CPP和程序混在一起很的不方便. 以下全为c++知识,读取文件中面的特定格式的数据: Vertex Count: 36 Data: ...
- 怎样在同一台电脑使用不同的账号提交到同一个github仓库
近期这段时间使用github.有时在公司办公,想要用git提交代码到自己的github仓库,提交是显示的作者是自己在公司的账户.而不是自己的github账户.这就相当于提交到github的代码不是自己 ...
- node generator 模仿co
exports.run = function(fn ){ return function(onDone){ function thunk(tfn , ctx){ return function(sql ...
- COCOS2D-X 动作 CCSequence动作序列
CCSequence继承于CCActionInterval类,CCActionInterval类为延时动作类,即动作在运行过程中有一个过程. CCSequence中的重要方法: static CCSe ...
- 为data盘加入磁盘(asm external)
1.创建盘,并两个节点皆能够訪问. 2.检查集群状态 [grid@rac1 ~]$ crsctl status res -t ------------------------------------- ...
- CXF WebService中传递复杂对象(List、Map、Array)
转自:https://wenku.baidu.com/view/047ce58ed0d233d4b14e69eb.html 现在开始介绍传递复杂类型的对象.如JavaBean.Array.List.M ...
- 10.QT程序框架与connect
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup ...
- Docker容器查看ip地址
第一步:进入centos7容器:yum install net-tools -y 我这里已经加载过,所以没有继续加载 第二步:加载完成之后可以输入 ifconfig查看ip地址
- electron-vue中使用iview 报错this. is readonly的解决办法
title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...
- python之--初始面向对象
阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...