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

来源:互联网 发布:扫描系统漏洞软件 编辑:程序博客网 时间:2024/05/17 04:08
概念     

有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理。但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的。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 sleepfrom random import randomfrom threading import Thread, localdata = local()def bar():    print 'called from %s'%data.vdef 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 sleepfrom random import randomfrom threading import Thread, local#如果使用全局变量呢def bar1():    global v    print 'calledddddd from %s'%vdef 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 geventfrom gevent.local import localdata = local()def bar():    print 'called from %s'%data.vdef 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
2 1
原创粉丝点击