【问题标题】:Is there any reason to use Python threading.local() rather than a ContextVar (in >= 3.7)是否有任何理由使用 Python threading.local() 而不是 ContextVar(在 >= 3.7 中)
【发布时间】:2021-08-20 01:24:26
【问题描述】:

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

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

这是否意味着任何针对运行时 >= 3.7(引入 ContextVar 时)的代码最好在过去可能使用线程本地数据的任何地方使用 ContextVar?还是有理由更喜欢线程本地数据? (除了您特别想要将状态与线程而不是上下文相关联的场景。)

【问题讨论】:

  • 可能会有所帮助,来自contextvars docs 的第二段“具有状态的上下文管理器应使用上下文变量而不是 threading.local() 以防止其状态意外地流向其他代码,在并发代码中使用时。"

标签: python multithreading python-contextvars


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2013-07-28
    • 2011-11-25
    • 2018-10-20
    • 1970-01-01
    • 2018-03-02
    • 2017-02-14
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多