う呼びclose()の後urllib.urlopen()?
質問
私は新しいPythonの読解と、他の人のコード:
すべ urllib.urlopen()
続いて" urllib.close()
?その他、漏えい、正しいのですか。
解決
close
方法は、の結果に呼び出さなければなりません。のあなたはurllib.urlopen
を言及として、あなたが(を考えているようurllib
モジュール自体にurllib.close
、 にしない - のdoesn 「t)が存在します。
最善のアプローチ:その代わりx = urllib.urlopen(u)
などの使用:
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
with
書、およびclosing
コンテキストマネージャは、さえ例外の存在下で、適切な閉鎖を保証します。
他のヒント
のような@ピーターは、開範囲Urlの対象になるだろうがガベージコレクション
しかし、また、 urllib.py
定義:
def __del__(self):
self.close()
すること 場合参照カウントにそのインスタンスがゼロに達する, その __del__
メソッドが呼び、このようにその close
メソッドが呼しています。の"通常"の参照カウントがゼロであるようインスタンスの範囲があ厳重に停止から明示的な del x
早くしない直接電話 __del__
でも減らの参照カウントによる)してご利用いただけます。
それは確かにスタイルを明示的に閉資源が自動的にすべてのリスクを過ぎた資源がPython ま 自動的に掃除き、とてもおいしく頂けました。んな面白いように保持(。) 参考文献へのインスタンスのままでいることが必要です。
厳密に言えば、これは本当です。しかし実際には、一度urllib
がスコープの外に出る(あれば)、接続は自動ガベージコレクタによって閉鎖されます。
基本的に い 必要性を明示的に閉する時の接続用 IronPython.自動算出の範囲に依存してのガベージコレクションまた、ゴミの収集なに長くWindowsのソケットまたポーリング、ウェブサーバの高周波数(すなわち高IronPythonとの接続が許可~7Hz).また、"立つ"(ソケット使用)、プPerfMon.この溶液を電話 gc.collect()
後の呼び出しのたびに urlopen
.