Python 裡有個 threading.local(),可以取得 thread-local storage (TLS),也就是每个线程 (thread) 特有的存储空间。
场景重现
最近使用了这个特性,在Thread
的某个地方先设定了TLS
的一个属性,在同Thread
的另一个地方引用了它,结果去失败了,设定本应是成功的,但是为什么使用的时候却失败了,Why?
原因浅浅析
看了一些资料,发现是threading.local()
每次产生出来的对象都是独立的,虽然在同一个Thread
里面都取用同一份数据,但是这样的前提是必须使用同一个threading.local()
。
案例对比
我先产生一个threading.local()
对象,在上面先设定一个属性X=1,取值也没问题。
>>> import threading
>>> tls1 = threading.local()
>>> tls1.x = 1
>>> tls1.x
1
>>>
我们在这个时候在同一个Thread
,再产生一个threading.local()
对象,可以看出来,我们不能从这个新的对象中看到X属性。
>>> tls2 = threading.local()
>>> tls2.x
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
tls2.x
AttributeError: '_thread._local' object has no attribute 'x'
>>>
结论
TLS
机制可以看出,每个线程都有自己独立的TLS
,并且只能通过唯一一个入口进入。
网友评论