我应该在urllib.urlopen()之后调用close()吗?
我是Python新手,阅读别人的代码:
应urllib.urlopen()
后跟urllib.close()
? 否则,会泄漏连接,对吗?
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...
with
语句和closing
上下文pipe理器将确保在出现exception情况下正确closures。
像@Peter说的那样,超出范围的打开的URL将有资格进行垃圾回收。
但是,还要注意urllib.py
定义了:
def __del__(self): self.close()
这意味着当那个实例的引用计数达到零时 ,它的__del__
方法将被调用,因此它的close
方法也会被调用。 引用计数达到零的最“正常”的方法是简单地让实例超出范围,但没有任何东西严格地阻止你从显式的del x
早期(但是它不直接调用__del__
而是递减引用算一个)。
显式closures资源当然是一种很好的风格 – 尤其是当你的应用程序冒着使用太多资源的风险时 – 但是如果你不做任何有趣的事情,比如维护(循环)引用,Python 会自动清理到你不再需要的实例。
严格来说,这是真的。 但实际上,一旦(如果) urllib
超出范围,连接将被自动垃圾收集器closures。