0

文档中,我没有找到任何关于 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 之间切换上下文?

4

1 回答 1

1

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

我希望您记住,上下文变量在获取或设置其内容时不会复制对象:也就是说,您检索的字典与getcontext_var 值相同:当您更新其中的键时,没有需要将值设置回上下文变量:字典已经更新。

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

于 2021-12-07T18:50:45.443 回答