Python threading.local()在Thread类中不起作用

时间:2018-03-20 03:00:36

标签: python multithreading local

在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对象在实例函数之间无法正常工作?

2 个答案:

答案 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消失。

对于线程间通信Futures可能是一个不错的选择。其他一些是条件变量事件等。请参阅threading文档页面。