您的位置:首页 > 编程语言 > Python开发

Python: threading.local是全局变量但是它的值却在当前调用它的线程当中

2008-06-04 22:46 806 查看
在threadingmodule中,有一个非常特别的类local。一旦在主线程实例化了一个local,它会一直活在主线程中,并且又主线程启动的子线程调用这个local实例时,它的值将会保存在相应的子线程的字典中。

我们先看看测试代码:

#!/usr/bin/python
#-*-coding:utf-8-*-
#Description:testthethreading.localclass
#Create:2008-6-4
#Author:MK2[fengmk2@gmail.com]
fromthreadingimportlocal,enumerate,Thread,currentThread

local_data=local()
local_data.name='local_data'

classTestThread(Thread):
defrun(self):
printcurrentThread()
printlocal_data.__dict__
local_data.name=self.getName()
local_data.add_by_sub_thread=self.getName()
printlocal_data.__dict__

if__name__=='__main__':
printcurrentThread()
printlocal_data.__dict__

t1=TestThread()
t1.start()
t1.join()

t2=TestThread()
t2.start()
t2.join()

printcurrentThread()
printlocal_data.__dict__
运行结果:

<_MainThread(MainThread,started)>
{'name':'local_data'}
<TestThread(Thread-1,started)>
{}
{'add_by_sub_thread':'Thread-1','name':'Thread-1'}
<TestThread(Thread-2,started)>
{}
{'add_by_sub_thread':'Thread-2','name':'Thread-2'}
<_MainThread(MainThread,started)>
{'name':'local_data'}
主线程中的local_data并没有被改变,而子线程中的local_data各自都不相同。
怎么这么神奇?local_data具有全局访问权,主线程,子线程都能访问它,但是它的值却是各当前线程有关,究竟什么奥秘在这里呢?
查看了一下local的源代码,发现就神奇在_path()方法中:
def_patch(self):
key=object.__getattribute__(self,'_local__key')
d=currentThread().__dict__.get(key)
ifdisNone:
d={}
currentThread().__dict__[key]=d
object.__setattr__(self,'__dict__',d)

#wehaveanewinstancedict,socallout__init__ifwehave
#one
cls=type(self)
ifcls.__init__isnotobject.__init__:
args,kw=object.__getattribute__(self,'_local__args')
cls.__init__(self,*args,**kw)
else:
object.__setattr__(self,'__dict__',d)

每次调用local实例的属性前,local都会调用这个方法,找到它保存值的地方.

d=currentThread().__dict__.get(key)就是这个地方,确定了local_data值的保存位置。所以子线程访问local_data时,并不是获取主线程的local_data的值,在子线程第一次访问它是,它是一个空白的字典对象,所以local_data.__dict__为{},就像我们的输出结果一样。

如果想在当前线程保存一个全局值,并且各自线程互不干扰,使用local类吧。

Technorati:python,local,threading,thread
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐