我是Python新手并阅读其他人的代码:
应该urllib.urlopen()
跟着urllib.close()
?否则,一个人会泄漏连接,对吗?
Ale*_*lli 102
close
必须在结果上调用该方法urllib.urlopen
,而不是在urllib
您考虑的模块本身上调用(正如您所提到的urllib.close
- 哪些不存在).
最好的方法:x = urllib.urlopen(u)
使用:代替等,使用:
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
Run Code Online (Sandbox Code Playgroud)
该with
声明,以及closing
上下文管理器,将确保即使在例外的存在正确关闭.
Mar*_*off 12
就像@Peter所说的那样,超出范围的打开的URL将有资格进行垃圾回收.
但是,还要注意urllib.py
定义:
def __del__(self):
self.close()
Run Code Online (Sandbox Code Playgroud)
这意味着当该实例的引用计数达到零时,__del__
将调用其close
方法,因此也将调用其方法.引用计数达到零的最"正常"方式是简单地让实例超出范围,但没有什么能严格阻止你从del x
早期显式(但它不直接调用__del__
但只是将引用计数减少一个) ).
明确关闭资源肯定是好的方式 - 特别是当你的应用程序冒着使用过多资源的风险时 - 如果你不做任何有趣的事情,如维护(循环?)引用,Python 会自动为你清理到你不再需要的实例.
严格来说,这是真的。但实际上,一旦 (if)urllib
超出范围,连接将被自动垃圾收集器关闭。