是否有任何理由使用 Python threading.local() 而不是 ContextVar (>= 3.7)

Gra*_*Lea 12 python multithreading python-contextvars

Python 的线程本地数据ContextVars 似乎实现了相同的目标(虽然 API 略有不同),唯一面向用户的区别是 sContextVar可以使用异步代码(协程和 asyncio),而线程本地数据则不能。

这真的是唯一的实际区别吗?

这是否意味着任何针对运行时 >= 3.7(ContextVar引入时)的代码最好使用过去ContextVar可能使用过的所有线程本地数据?或者是否有理由仍然偏爱线程本地数据?(除了您特别想要将状态与线程而不是上下文关联的情况。)

jsb*_*eno 2

在我看来,主要问题是“稍微不同的 API”实际上是巨大的差异,虽然 thread.local 易于使用,但 ContextVars 提供了一个低级的痛苦(*)、难以掌握和冗长的替代方案。

除此之外,ContextVars 似乎是可行的方法。
我正在编写一些代码来包装 ContextVars,以便它们可以作为直接替代品,但它还没有准备好投入生产。

如果有人感兴趣,该项目现在已暂停,缺少对已发布包的一些改进(文档等...),但它功能齐全,位于: https: //github.com/jsbueno/extracontext/

(*) 好吧,“痛苦”可能太主观了,但我发誓感觉就是这样,但这可能是因为我目前没有需要它的“现实世界”用例,而且我使用的人工示例太人工了掌握实际用例。