在Python3.6中,我使用threading.local()来存储线程的某些状态。 这是一个简单的例子来解释我的问题:
import threading
class Test(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.local = threading.local()
self.local.test = 123
def run(self):
print(self.local.test)
当我开始这个帖子时:
t = Test()
t.start()
Python给了我一个错误:
AttributeError: '_thread._local' object has no attribute 'test'
似乎测试 atrribute无法访问 __ init __ 函数范围,因为我可以在 __ init __ 函数中打印该值本地设置属性 test = 123 。
是否有必要在Thread子类中使用threading.local对象?我认为Thread实例的实例属性可以保持属性线程安全。
无论如何,为什么threading.local对象在实例函数之间无法正常工作?
答案 0 :(得分:4)
构建线程时,您使用的是不同的线程。当您在线程上执行run方法时,您正在启动一个新线程。该线程还没有线程局部变量集。这就是为什么你没有在构造线程对象的线程上设置的属性,而不是运行该对象的线程。
答案 1 :(得分:1)
如https://docs.python.org/3.6/library/threading.html#thread-local-data中所述:
对于不同的线程,实例的值会有所不同。
Test.__init__
在调用者的线程中执行(例如t = Test()
执行的线程)。是的,它是创建线程本地存储(TLS)的好地方。
但是当t.run
执行时,它将具有完全不同的内容 - 只能在线程t
内访问的内容。
当您需要在当前线程范围内共享数据时,TLS很好。它只是函数内部的局部变量 - 但对于线程。当线程完成执行时 - TLS消失。