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

时间:2023-12-17 08:42:14
概念

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

多线程*享变量和局部变量的差别我画两个小图。简单描写叙述下(作图能力一般。请见谅,概念性的东西大家能够google下,非常多好文章)

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

全局变量

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

线程局部变量

对照:

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