python-上下文管理器Context

1.什么是上下文管理器?

  上下文管理器是一个对象,他定义了执行with语句时要建立的上下文,上下文管理器处理进去和退出所需运行时上下文执行代码块。简单来说一个上下文管理器至少包含__enter__和__exit__两个方法,python提供了contextlib模块中的contextmanager用作装饰器并配合迭代器yield更加方便地创建上下文。

  __enter___:代码执行时首先要进入的代码块,通常用于打开文件,建立连接等并最后返回一个对象,即 wirh open() as f:中的f。

  __exit__:代码执行结束后要进入的代码块,通常用于关闭链接等,并在with里面发生的异常抛到这里,避免异常继续传播。

 

2.python中flask的上下文

  1.flask中的上下文在3.7以前使用的的是localstack,这是flask自己封装的一个threadlocal,locakstack不仅支持单个线程局部变量,还支持协程局部变量。

    Q:为什么不用全局变量,全局统一使用多方便?

    A:由于GIL,每个线程或协程使用时,都会加锁,影响效率。

  2.threadlocal:

    threadlocal:简单来说在调用local()时,threadlocal会以线程id为键,数据为值保存起来,这样每个线程都能找到自己的数据,做到了线程数据的分离

3.contextvar:

  背景:localstack已经很好了,但对于线程中执行的并发异步任务来说,线程局部变量localstack已经不够了,对于不同的异步任务,可能在局部线程中同一个键有不同的值,这就导致其上下文会意外渗入到别的代码中,于是contextvar应运而生。

  定义:contextvars一个带有ContextVarContext、 和Token类以及一个函数的新模块copy_context()

  原理:在python3.7.1中,提出了一种管理上下文的新机制,该机制涉及到的关键类就是contextvar。在访问上下文时,应声明一个模块全局变量,其中包含一个Contextvar,通过get()访问,set()修改。

  “当前值”是contextvar的重要概念,用户无法直接获取当前context的引用,但可以使用contextvar.copy_context()获取他的浅表副本,这就确保了调用者是当前对象唯一拥有者。

posted @ 2023-08-23 12:08  lv99  阅读(70)  评论(0编辑  收藏  举报