質問

私は新しい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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top