[Python]threading local 线程局部变量小测试

概念     

有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理。但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的。python threading模块中就提供了这么一个类,叫做local。

多线程中共享变量和局部变量的区别我画两个小图,简单描述下(作图能力一般,请见谅,概念性的东西大家可以g下,很多好文章)

全局变量

 

线程局部变量

 

 

对比:

下面是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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值