soll ich rufe nach urllib.urlopen close () ()?
Frage
Ich bin neu in Python und liest jemand anderes Code:
sollte urllib.urlopen()
von urllib.close()
folgen? Andernfalls würde man Verbindungen undicht, oder?
Lösung
Die close
Methode muss auf dem Ergebnis aufgerufen werden von urllib.urlopen
, nicht auf dem urllib
Modul selbst als Sie denken über (wie Sie urllib.close
erwähnen - die doesn ‚t exist).
Der beste Ansatz: Statt x = urllib.urlopen(u)
usw., zu verwenden:
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
Die with
Anweisung und der closing
Kontext-Manager, kann die ordnungsgemäße Schließung sicherzustellen, auch in Anwesenheit von Ausnahmen.
Andere Tipps
Wie @ Peter sagt, out-of-scope geöffnet URLs für die Garbage Collection berechtigt werden wird.
Aber auch beachten Sie, dass urllib.py
definiert:
def __del__(self):
self.close()
Das bedeutet, dass , wenn der Referenzzähler für diese Instanz Null erreicht , seine __del__
Methode wird aufgerufen, und somit wird seine close
Verfahren auch genannt werden. Der meist „normale“ Weg für die Referenzzähler Null zu erreichen, ist einfach die Instanz von Umfang hinausgehen zu lassen, aber es ist streng nichts, was man von einem expliziten del x
stoppt früh (aber es nicht direkt __del__
nennen, aber dekrementiert nur den Referenzzähler nach der anderen).
Es ist sicherlich gut Stil explizit schließen Sie Ihre Ressourcen - vor allem, wenn die Anwendung das Risiko der Verwendung von zu viel der Ressourcen läuft - aber Python wird automatisch für Sie aufzuräumen, wenn Sie nicht tun alles tun, lustig wie die Aufrechterhaltung (circular?) Verweise auf Instanzen, die Sie brauchen nicht mehr.
Genau genommen, das ist wahr. Aber in der Praxis einmal (wenn) urllib
Spielraum erlischt, wird die Verbindung durch die automatische Garbage Collector geschlossen werden.
Sie im Grunde tun Notwendigkeit, explizit schließen die Verbindung bei der Verwendung von Ironpython . Die automatische Schließung auf geht out of scope beruht auf der Garbage Collection. Ich lief in eine Situation, wo die Garbage Collection nicht so lange lief für die Windows Sockets lief. Ich war Polling ein Webserver mit hohen Frequenz (das heißt so hoch wie Ironpython und die Verbindung würde es ermöglichen, ~ 7 Hz). Ich konnte die „etablierten Verbindungen“ (d-Buchsen im Einsatz) gehen und bis auf PerfMon sehen. Die Lösung wurde auf Anruf gc.collect()
nach jedem Gespräch zu urlopen
.