Python全栈工程师

20.6-上下文管理器Context Manager

2019-10-06  本文已影响0人  BeautifulSoulpy

只要一个人还有追求,他就没有老。直到后悔取代了梦想,一个人才算老!


上下文管理跟操作系统相关,后面慢慢加深理解;文件描述符资源是有上限的(默认1024);

很多情况,当我们使用完一个资源后,我们需要手动的关闭掉它,比如操作文件,建立数据库连接等。但是,在使用资源的过程中,如果遇到异常,很可能错误被直接抛出,导致来不及关闭资源。所以在大部分程序语言里,我们使用”try-finally”语句来确保资源会关闭。比如下面的Python写文件代码:

try:
    f = open('test.txt', 'a+')
    f.write('Foo\n')
    print('!!!!!')
finally:
    f.close()
    print('_____')

当”try-finally”中间的逻辑复杂,而且还带有各种嵌套的话,代码就很不容易维护。Python的with语句,可以说功能同上面的”try-finally”几乎一样,但代码看上去简洁的多,我们来实现同样的功能:

with open('test.txt', 'a+') as f:
    f.write('Foo\n')

f8 = open('test.txt','r+')
with f8:
    f8.write('ssss')
    print('~~~~~~~~~~~~')

在with语句块退出时,”f.close()”方法会自动被调用,即使”f.write()”出现异常,也能确保close()方法被调用。

上下文管理——交给解析器去释放文件对象

  1. 使用with ... as f :关键字 , f 不是上下文管理器,应该是文件资源对象(默认上限1024);
  2. 上下文管理的语句块并不会开启新的作用域;是一种特殊语法
  3. with语句块执行完的时候,会自动关闭文件对象(程序退出都不能阻止)

上下文管理包括:
自定义类来使用上下文管理器
异常处理
contextlib模块
closing()方法
contextmanager装饰器

对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭、注销,以释放资源。
IO被打开的时候,会获得一个文件描述符。计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机
的资源不要被完全耗尽,计算资源是共享的,不是独占的。
一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题。

上一篇下一篇

猜你喜欢

热点阅读