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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top