打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python3.7 contextvars 初探

数据科学俱乐部

中国数据科学家社区

简述

Python 3.7 于2018年6月27日发布,本篇文章将对其中新增模块contextvars 做初步介绍,为读者勾勒一个大概轮廓。

资料来源: Python 3.7 文档、源码。

1、contextvars是什么

2、类与方法

3、如何理解上下文

4、总结

一、contextvars是什么

这个模块提供了一组接口,可用于管理、储存、访问 局部上下文的状态。

主要用于在异步环境中管理上下文变量。

二、类与方法

1、ContextVar(name[, *, default])

这个类用于表示一个上下文变量。

参数:

: 必要位参; 用于检验和Debug.

: 默参,且只能用keyword方式指定; 用于设定这个上下文变量的默认值。

属性:

:只读特性。

:返回该上下文变量的值。未指定默认值且上下文变量无默认值时,抛出。

:设置上下文变量的值,返回一个与变量当前值相关的Token对象,可用于重置上下文变量的值到该次set之前。

:使用token重置上下文变量的值。

示例:

输出:

2、Token

属性:

: 只读特性,指向创建它的上下文变量。

: 只读特性,保存set之前的上下文变量的值。如果值为空,该特性指向.

3、Context

类型:

:上下文变量的值

属性:

:返回的浅拷贝。

:在该上下文中运行.

当多线程同时执行时,抛出.

当递归地执行时,也会抛出.

同一个,在同一时刻只能有一个方法运行。

PS:多进程显然不在考虑范围内。

文档示例:

4、模块方法:

返回当前上下文的拷贝。

时间复杂度: O(1)。因为在C源码中,这个函数只做了新建对象和指针复制。

不管当前上下文有多臃肿,的消耗都是不变的。

三、如何理解上下文

自己动手写一些小程序试验一下是最好的方法。

这里给出我的理解:

作用域规定了对象访问权,而上下文规定了上下文变量值访问权。

我们用表示上下文变量,而具体的值存储在中。所以实现为的。在不同的上下文中,同一个上下文变量的值可以不同。

如果作用域中没有,你是无法访问或修改的,文档中建议在模块级别定义也是这个原因。

Q & A

Q:定义时发生了什么?

A:新建了一个对象,仅此而已,上下文中没有保存它。当被set后,上下文中才会有它。

Q:访问或修改时发生了什么?

A:访问时,实际上是在当前上下文中查表,返回当前上下文中的值。修改同理,实际上是改表。(在源码中还有cache,这里不作说明)

Q:Context机制如何实现?

A:Context与ThreadState相关,进入上下文时“占据”当前线程,退出时“放弃”当前线程。

四、总结

contextvars为异步而生,上下文对象将简化asyncio的复杂操作,给异步程序的编写带来方便,推荐高级玩家使用。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用 contextvars 管理上下文变量
第八章. 上下文
Python中的默认参数值
JMeter处理器09
Start Python 学习笔记(琐碎知识,持续更新。。。)
CEF(Chromium Embedded Framework和JavaScript交互相互调用函数和设置数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服