Python线程\u本地数据

Python线程\u本地数据,python,python-multithreading,Python,Python Multithreading,使用threading.local()的Python模块文档 用于存储线程之间不共享的数据 使用它有什么根本性的问题吗 threading.current_thread().x= 42 而不是 mydata= threading.local() mydata.x= 42 ? 前者稍微污染了thread对象的名称空间,但如果需要,可以处理它。除此之外,这两种方法似乎都有效,但在文档中推荐使用后者肯定是有原因的。threading.local()对象可以从任何地方访问,但它将根据访问该对象的线程

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

使用它有什么根本性的问题吗

threading.current_thread().x= 42
而不是

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

前者稍微污染了thread对象的名称空间,但如果需要,可以处理它。除此之外,这两种方法似乎都有效,但在文档中推荐使用后者肯定是有原因的。

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

例如:

mydata=threading.local()
mydata.x=42
def foo():
mydata.x='Hello from thread'
打印(mydata.x)
thread1=threading.Thread(目标=foo)
thread1.start()
thread1.join()
>>>“线程你好”
打印(mydata.x)
>>> 42
使用
threading.current_thread().x
无法实现该行为

更新

更清晰的例子:

导入线程
从线程导入当前线程
threadLocal=threading.local()
def hello():
initialized=getattr(threadLocal,'initialized',None)
如果初始化为“无”:
打印('很高兴认识你',当前线程().名称)
threadLocal.initialized=True
其他:
打印('Welcome back',current_thread().name)
你好()
你好()
#输出
“很高兴认识你主线”
“欢迎回到主线”
threading.local()
对象可以从任何地方访问,但它将根据访问该对象的线程返回不同的数据

例如:

mydata=threading.local()
mydata.x=42
def foo():
mydata.x='Hello from thread'
打印(mydata.x)
thread1=threading.Thread(目标=foo)
thread1.start()
thread1.join()
>>>“线程你好”
打印(mydata.x)
>>> 42
使用
threading.current_thread().x
无法实现该行为

更新

更清晰的例子:

导入线程
从线程导入当前线程
threadLocal=threading.local()
def hello():
initialized=getattr(threadLocal,'initialized',None)
如果初始化为“无”:
打印('很高兴认识你',当前线程().名称)
threadLocal.initialized=True
其他:
打印('Welcome back',current_thread().name)
你好()
你好()
#输出
“很高兴认识你主线”
“欢迎回到主线”

我可以实现这种行为,如果我将代码中的
mydata.x
替换为
threading.current\u thread().x
,那么输出将是相同的。很抱歉,您的更新没有澄清。请使用
threading.current_thread()
运行示例以显示任何差异。毫无疑问,
threading.local()
所做的就是文档中声称的那样。显然,我不理解你的问题,也没有什么可以帮助你的。感谢您提出的问题我可以实现这种行为,如果我将代码中的
mydata.x
替换为
threading.current_thread().x
,那么输出将是相同的。抱歉,您的更新没有澄清。请使用
threading.current_thread()
运行示例以显示任何差异。毫无疑问,
threading.local()
所做的就是文档中声称的那样。显然,我不理解你的问题,也没有什么可以帮助你的。谢谢你的提问