美文网首页Python全栈工程师
20.6-上下文管理器Context Manager

20.6-上下文管理器Context Manager

作者: BeautifulSoulpy | 来源:发表于2019-10-06 09:30 被阅读0次

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


    上下文管理跟操作系统相关,后面慢慢加深理解;文件描述符资源是有上限的(默认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被打开的时候,会获得一个文件描述符。计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机
    的资源不要被完全耗尽,计算资源是共享的,不是独占的。
    一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题。

    相关文章

      网友评论

        本文标题:20.6-上下文管理器Context Manager

        本文链接:https://www.haomeiwen.com/subject/nequpctx.html