使用with open(),不需要写close语句,默认自动帮我们关闭文件

1、with基于上下文,会自动帮助我们关闭文件。

  如果不关闭文件,会怎么样?对于在个人电脑上没什么影响。如果你执行的python程序结束了,文件会自动关闭。

  服务器端如果不关闭文件,会出现句柄泄露,导致句柄耗尽。

2、对于linux系统,每次做一件事,就会打开一个文件,进行读,写。。。等操作,然后关掉。但是打开的文件在linux系统有一个上限,不能打开过多的文件,上限是65535个文件。

  服务器端开的文件一般是不关闭的,服务器的进程不会自己结束掉的。如果打开的文件个数超过65535个,就会出现句柄耗尽,其他linux所有的文件都被卡死了。这个时候打开文件会发现操作系统没有可用的句柄了。所以不关闭文件一般对服务器端有限制。

 

3、文件如果没有关闭,会导致你写入的内容,没有真正写到磁盘上;

    不关文件是否可以让文件的内容实时写入磁盘里面,而不是最后等到关闭文件才写入?

    答案是可以的。可以使用flush()配合open()来实现。经验证,flush()之前是没有写入的,flush()之后数据写入文件了。

flush就是实时刷新,把你写入的文件内容写到磁盘里。Windows之所以会有这种机制,是因为如果每写入几个字符就要操作一次IO的话,对磁盘的压力会特别大。

而flush()之后再输入的数据就没有被写入文件中。

 

 

知识补充:

句柄当做一个人的名字,并"可以通过名字(句柄),实现对句子的引用和访问", 感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄之所以有意义正因为它具有唯一性,所以这种比喻也有问题。

如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些? 

文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整 数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码;

当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东西都使用句柄,如窗口,socket。 

 

句柄泄露示例,参考:https://www.cnblogs.com/wendiyou/p/11372666.html

 

posted @ 2020-06-11 11:25  anna1210  阅读(4922)  评论(0编辑  收藏  举报