Python thread_local数据

问题描述

使用threading.local()的Python threading模块文档recommends 用于存储线程之间不共享的数据。

使用时是否有任何基本问题

threading.current_thread().x= 42

代替

mydata= threading.local()
mydata.x= 42

前者会稍微污染线程对象的命名空间,但是可以根据需要进行处理。除此之外,这两种方法似乎都可行,但是必须在文档中推荐使用后者是有原因的。

解决方法

threading.local()对象可以从任何地方访问,但是根据访问该对象的线程,它将返回不同的数据。

示例:

mydata= threading.local()
mydata.x= 42

def foo():
    mydata.x = 'Hello from thread'
    print(mydata.x)

thread1 = threading.Thread(target=foo)
thread1.start()
thread1.join()

>>> 'Hello from thread'

print(mydata.x)
>>> 42

使用threading.current_thread().x不能实现这种行为。

更新

更清晰的例子:

import threading
from threading import current_thread

threadLocal = threading.local()

def hello():
    initialized = getattr(threadLocal,'initialized',None)
    if initialized is None:
        print('Nice to meet you',current_thread().name)
        threadLocal.initialized = True
    else:
        print('Welcome back',current_thread().name)


hello()
hello()

# output
'Nice to meet you MainThread'
'Welcome back MainThread'