首页 > 编程语言 >python-上下文管理器Context

python-上下文管理器Context

时间:2023-08-23 12:22:58浏览次数:37  
标签:__ 管理器 python contextvar 线程 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()获取他的浅表副本,这就确保了调用者是当前对象唯一拥有者。

标签:__,管理器,python,contextvar,线程,Context,上下文
From: https://www.cnblogs.com/lvqiang/p/17650863.html

相关文章

  • python读取shapefile
     #!/usr/bin/envpython#coding:utf-8#AutorGaoSong#读取shp数据importosimporttkinterimporttkinter.messageboximporttkinter.filedialogfromosgeoimportgdalfromosgeoimportosrfromosgeoimportogrfromosgeoimportgdalconstclassARCVIE......
  • python获取网络时间和本地时间
    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释。python获取网络时间1234567891011121314151617181920212223242526272829获取网络时间def getBeijinTime():"""获取北京时间"""try:conn= httplib.HTTPConnection("www.beijing-time.org")co......
  • Python基础入门学习笔记 070 GUI的终极选择:Tkinter7
    实例1:添加Tags1fromtkinterimport*23root=Tk()4text=Text(root,width=30,height=5)5text.pack()67#INSERT索引表示插入光标当前的位置8text.insert(INSERT,"IloveFishC.com!")#光标当前的位置插入9#注意,行号从1开始,列号则从0开始10text.ta......
  • Python中的if-else语法糖
    Python中的if语句是用于条件控制的一种语法结构,可以根据条件的真假来决定程序的执行路径。在Python中,if语句的语法如下:if条件:执行语句块其中,条件是一个返回布尔值的表达式,如果条件为True,那么执行语句块中的代码;如果条件为False,则跳过语句块。除了基本的if语句外,Python还......
  • Python基础入门学习笔记 067 GUI的终极选择:Tkinter4
    实例1:1fromtkinterimport*23root=Tk()#创建主窗口4e=Entry(root)#在主窗口中插入输入框5e.pack(padx=20,pady=20)67e.delete(0,END)#清空输入框8e.insert(0,"默认文本...")#设置输入框内容910mainloop() 实例2:1fromtkinterimp......
  • Python基础入门学习笔记 068 GUI的终极选择:Tkinter5
    Listbox组件如果需要提供选项给用户选择,单选可以用Radiobutton组件,多选可以用Checkbutton,如果提供的选项非常多,可以考虑使用Listbox组件。Listbox是以列表的形式显示出来,并支持滚动条操作。实例1:1fromtkinterimport*23root=Tk()#创建主窗口45theLB=Listb......
  • Python基础入门学习笔记 069 GUI的终极选择:Tkinter6
    Text组件Text(文本)组件用于显示和处理多种任务。虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器和网页浏览器使用。实例1:插入内容1fromtkinterimport*23root=Tk()4text=Text(root,width=30,height=2)5text.pack()6#INSERT......
  • Python基础入门学习笔记 066 GUI的终极选择:Tkinter3
    实例1:Checkbutton组件1fromtkinterimport*23root=Tk()4#需要一个Tkinter变量,用于表示该按钮是否被选中5v=IntVar()6c=Checkbutton(root,text="测试一下",variable=v)78c.pack()9#如果被选中,那么变量v被赋值为1,否则为010#可以用个Label......
  • Pybind11:使用C++编写Python模块
    放假摆了一周了。看论文实在不是什么有意思的活。这两天研究了一下Pybind11的用法。使用C/C++和Python混合编程的想法很早就有了,在大一的一次比赛时曾经实践过(虽然不是我写的),当时获得了比较显著的性能提升。但是当时用的是Swig,据队友说Swig对于NumPy的支持极为阴间,当时调试花了好......
  • Python基础入门学习笔记 064 GUI的终极选择:Tkinter
    >>>importtkinter #Tkinter是python默认的GUI库,导入Tkinter模块>>> 实例1:1importtkinterastk23root=tk.Tk()#创建一个主窗口,用于容纳整个GUI程序4root.title("FishCDemo")#设置主窗口对象的标题栏56#添加一个Label组件,可以显示文本、图标或者图......