contextvars:获取和设置原子

contextvars: get and set atomic

documentation 中,我没有找到任何关于 contextvars update

我需要自动执行以下操作:

context_metadata = contextvars.ContextVar("context_logger_metadata")
my_dict = context_metadata.get()
my_dict['appended'] = 'some_data'
context_metadata.set(my_dict)

python是否提供同步块之类的东西?我如何确定 GIL 不会在 get 和 set 之间切换上下文?

如评论中所述:在异步程序中,上下文切换仅发生在开发人员控制下的显式点:调用没有 await,没有上下文切换。在您的示例代码中,您的“读取、更改、设置”顺序将不会中断。

我希望您记住,contextvars 在获取或设置其内容时不会复制对象:也就是说,您使用 get 检索的字典与 context_var value: 当你更新其中的一个键时,不需要将值设置回上下文 var: 字典已经更新了。

如果您的代码使用线程,或者将线程与异步代码结合使用,那么围绕您的原子操作的传统 threading.Lock 用法将起作用。