下文我们以python举例。
在使用 Python开发的时候,经常使用上下文管理器来打开文件。Python 上下文管理器可以轻松关闭文件:
with open("hello.txt", mode="w") as file: file.write("Hello, World!")
示例中,只要上下文处于活动状态,上下文管理器就会打开文件hello.txt并管理文件资源。通常,缩进块中的所有代码都取决于打开的文件对象。一旦缩进块结束或引发异常,文件将关闭。
如果您没有使用上下文管理器或者您使用不同的语言工作,那么您可以使用try...finally方法显式关闭文件:
try: file = open("hello.txt", mode="w") file.write("Hello, World!")finally: 电脑 file.close()
关闭文件的块finally无条件运行,无论该try块成功还是失败。虽然这种语法有效地关闭了文件,但 Python 上下文管理器提供了更简洁和更直观的语法。
但您有没有想过,为什么在 Python 中关闭文件很重要?
答案是:文件是受操作系统限制的资源
Python 将文件操作委托给操作系统。操作系统是进程(如 Python)和所有系统资源(如硬盘驱动器、RAM 和 CPU 时间)之间的中介。
当您打开文件时open(),您会对操作系统进行系统调用,以便在硬盘驱动器上找到该文件并为读取或写入做好准备。然后,操作系统将返回一个无符号整数,在 Windows 上称为文件句柄,在类 UNIX 系统(包括 Linux 和 macOS)上返回一个文件描述符:
一个 Python 进程进行系统调用并获取整数 10 作为文件句柄
获得与文件关联的编号后,您就可以进行读取或写入操作了。每当 Python 想要读取、写入或关闭文件时,它都会进行另一个系统调用,提供文件句柄号。Python 文件对象有一个.fileno()方法可以用来查找文件句柄电脑:
with open("test_file.txt", mode="w") as file: file.fileno()
fileno()方法将返回操作系统使用的整数作为文件描述符。
操作系统对于任何单个进程可以拥有的打开文件的数量都有限制。这个数字通常是数千。操作系统设置此限制是因为如果一个进程试图打开数千个文件描述符,则该进程可能有问题,而且保持文件打开会使您容易丢失数据。
采用上下文管理器管理您的文件是一种防御性技术,建议使用。
限制是由操作系统而不是 Python 强制执行的。但是,理论上操作系统可以处理更多的文件描述符,但实际上您会遇到的操作系统的限制。
OSError: [Errno 24] Too many open files: 'xxx.txt'
但是根据操作系统的不同,有方法可以提高每个进程的文件数限制。但是,您应该问问自己是否真的需要这么做。
例如在进行服务器与大量的客户端进行通讯时,就可能提高文件句柄数。
为什么操作系统会限制文件句柄?
从操作系统的角度来看,这个限制相对保守,任何达到限制的进程都可能会泄漏文件句柄以及其他资源。
对于大多数应用程序来说,打开太多的文件句柄是没有意义的。如果只是处理文件,反而会降低程序效率。
如果不关闭文件和 Python 崩溃会发生什么?
import osfile = open("crash.txt", mode="w")file.write("Hello, world!")os._exit(1)
运行上面的代码片段后,您会看到操作系统创建了该文件,它也没有任何内容。
Python 默认是使用一个缓冲区来收集写操作。当缓冲区满时,或者文件被显式关闭时,缓冲区被刷新,写操作完成。
示例里os._exit()直接将python解释器退出,模拟了崩溃。导致程序异常。
所以说
如果不close,会导致进程结束丢失缓冲区数据。操作系统对打开的文件数是有限制的,打开文件大量的没关闭,造成计算机资源浪费。打开文件大量没关闭,一旦出现=异常崩溃,可能干扰操作系统清理程序,甚至造成文件锁定,别的程序无法正常访问。电脑