Python: threading.local是全局变量但是它的值却在当前调用它的线程当中
2008-06-04 22:46
806 查看
在threadingmodule中,有一个非常特别的类local。一旦在主线程实例化了一个local,它会一直活在主线程中,并且又主线程启动的子线程调用这个local实例时,它的值将会保存在相应的子线程的字典中。
我们先看看测试代码:
<_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()方法中:
每次调用local实例的属性前,local都会调用这个方法,找到它保存值的地方.
d=currentThread().__dict__.get(key)就是这个地方,确定了local_data值的保存位置。所以子线程访问local_data时,并不是获取主线程的local_data的值,在子线程第一次访问它是,它是一个空白的字典对象,所以local_data.__dict__为{},就像我们的输出结果一样。
如果想在当前线程保存一个全局值,并且各自线程互不干扰,使用local类吧。
Technorati:python,local,threading,thread
我们先看看测试代码:
#!/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: threading.local是全局变量但是它的值却在当前调用它的线程当中
- 打印出python 当前全局变量和入口参数的所有属性
- C++调用PythonAPI线程状态和全局解释器锁
- 打印出python 当前全局变量和入口参数的所有属性
- python 局部local和全局global变量
- 在Python中通过threading模块定义和调用线程的方法
- 线程间通信 1全局变量2当前主对话框指针3发消息方式4 AfxBeginThread的返回值(为CWinThread类型的指针)5AfxGetApp
- 【Python基础】之全局变量(UnboundLocalError: local variable referenced before assignment)
- 在python中实现生产者和消费者的例子(五):使用threading模块和全局变量
- 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)
- Python全局变量global和局部变量 UnboundLocalError: local variable 'x' referenced before assignment
- 关与线程中全局变量调用问题
- 在Python中通过threading模块定义和调用线程的方法
- 打印出python 当前全局变量和入口参数的所有属性
- python:线程的使用、线程共享全局变量、列表作为参数(全局变量)、避免全局变量被修改
- Python-线程内的全局变量
- C++调用PythonAPI线程状态和全局解释器锁
- 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment 分类: divide into python python基础学习 问题总结 2014-01-01 16:35 4595人阅读 评论(0)
- Python 线程,独立的线程空间(threading.local())
- python:线程的使用、线程共享全局变量、列表作为参数(全局变量)、避免全局变量被修改