Python的TLS机制中的threading.local()

2019-03-22  本文已影响0人  云爬虫技术研究笔记

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,并且只能通过唯一一个入口进入。

上一篇 下一篇

猜你喜欢

热点阅读