问题描述
使用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'