标签:多线程 python 局部变量 local orangelliu
有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理。但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的。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])
类似线程的结果。
[Python]threading local 线程局部变量小测试,布布扣,bubuko.com
[Python]threading local 线程局部变量小测试
标签:多线程 python 局部变量 local orangelliu
原文地址:http://blog.csdn.net/orangleliu/article/details/38741275