python - 了解python关闭方法
问题描述
是否正确理解以下两个功能完全相同?不管它们是如何被调用的。
def test():
file = open("testfile.txt", "w")
file.write("Hello World")
def test_2():
with open("testfile.txt", "w") as f:
f.write("Hello World")
因为当一个对象不再被引用时,python 会调用 close 方法。
如果不是,那么这句话让我感到困惑:
当一个文件的引用对象被重新分配给另一个文件时,Python 会自动关闭一个文件。使用 close() 方法关闭文件是一个好习惯。
解决方案
不,该close
方法将在第一种情况下由 python 垃圾收集器(终结器)机器调用,在第二种情况下立即调用。如果您循环调用您的test
或test_2
函数数千次,观察到的行为可能会有所不同。
文件描述符(至少在 Linux 上)是一种宝贵而稀缺的资源(当它耗尽时,open(2)系统调用会失败)。在 Linux 上,使用getrlimit(2) 来查询进程RLIMIT_NOFILE
的文件描述符数量限制。您应该更喜欢在文件句柄无用时快速调用close(2)系统调用。
您的问题是特定于实现的、特定于操作系统的和特定于计算机的。您可能想通过阅读操作系统:三个简单的部分来了解有关操作系统的更多信息。
在 Linux 上,也可以在终端中尝试cat /proc/$$/limits
or命令。cat /proc/self/limits
您会看到以Max open files
(在我的 Debian 台式计算机上,现在是 2019 年 12 月,软限制为 1024)开头的一行。请参阅proc(5)。
推荐阅读
- android - 如何在房间中存储对象类型
- javascript - AG-Grid 列下拉面板自定义消息
- python - 如何使用线性全等生成器 (LCG) 方法生成 -1 和 1 之间的随机数?
- python - 如何将相同的字符串变量附加到循环中的字符串
- wpf - 在 .Net Core 3.1 中依赖注入 IOption<> 设置时,带有 Prism 和 DryIOC 的 WPF 失败
- java - JDBC 未在特定列更新 sqlite 表
- c# - 如何检查函数在运行时是否没有副作用(纯)?
- git - 在“合并”和“推送”上执行的 Git 预推送挂钩?
- python - Errno 13 更新 conda 时权限被拒绝
- authentication - Testcafe - 在 Native Dialog 中输入用户名和密码