Anfragen Ich habe Code mit 2.4.3 geschrieben und die folgende Warnung erhalten:
ResourceWarning: unclosed <socket.socket ...>
Oder
ResourceWarning: unclosed <ssl.SSLSocket ...>
Es scheint, dass gesagt wird, dass die Steckdose nicht geschlossen ist. ResourceWarning funktioniert normalerweise nicht (sieht so aus), weil es ignoriert wird, wenn es nicht im Debug-Modus erstellt wurde, aber ich mache mir Sorgen, dass es jedes Mal passiert, wenn ich einen Unit-Test durchführe. Vor allem dachte ich, wenn die Steckdose nicht wirklich geschlossen wäre, müsste sie richtig geschlossen werden.
Dieser Fall wurde bereits in der Ausgabe gemeldet. Schauen wir uns das an. ResourceWarning in python 3.2+ #1882 Es fühlt sich an, als hätte ich es überflogen
Es scheint, dass. Wenn die Codeausführung beendet ist, bevor der GC in einem Komponententest usw. ausgeführt wird, wird dies als Warnung angezeigt, scheint jedoch kein echtes Problem zu sein. Auf dieser Grundlage werden wir derzeit mögliche Problemumgehungen in Betracht ziehen.
Es gibt keinen Körper oder Deckel,
unittest.main(warnings='ignore')
Dadurch wird die Warnung beendet. In dieser "ResourceWarning" heißt es "Die Warnung ist ärgerlich, aber nicht symptomatisch für ein Problem.". Sie können sie also ignorieren, aber es ist eine grobe Möglichkeit, alle Warnungen zu beseitigen. Gibt es….
Versuchen Sie basierend auf Problemumgehung in der obigen Ausgabe eine Klasse zu erstellen, die im with-Block verwendet werden kann.
http_wrapper.py
class HttpWrapper(object):
def __init__(self, http_method, url, **kwargs):
self.http_method = http_method
self.url = url
self.kwargs = kwargs
def __enter__(self):
result = self.http_method(self.url, **self.kwargs)
self.connection = result.connection
return result
def __exit__(self, type, value, traceback):
self.connection.close()
Verwenden Sie wie folgt.
with HttpWrapper(requests.get, 'http://...', auth=...) as result:
#Verarbeitung mit Ergebnis
Dies bedeutet jedoch, dass der Verbindungspool überhaupt nicht verwendet wird ...
Es ist fast dasselbe wie Problemumgehung 2, basiert jedoch auf Problemumgehung, die in der obigen Ausgabe als Committer vorgeschlagen wurde. Erstellen wir eine Klasse, die im with-Block verwendet werden kann.
session_manager.py
from enum import Enum
from requests import Session
class HttpMethod(Enum):
get = 'get'
post = 'post'
put = 'put'
delete = 'delete'
class SessionManager(object):
def __init__(self, http_method, url, **kwargs):
self.http_method = http_method
self.url = url
self.kwargs = kwargs
def __enter__(self):
self.session = Session()
result = getattr(self.session, self.http_method.name)(self.url, **self.kwargs)
return result
def __exit__(self, type, value, traceback):
self.session.close()
Verwenden Sie wie folgt.
with SessionManager(HttpMethod.get, 'http://...', auth=...) as result:
#Verarbeitung mit Ergebnis
Dies bedeutet auch, dass der Verbindungspool überhaupt nicht verwendet wird ...
Ich habe das Gefühl, dass alle Problemumgehungen nicht gut genug sind ... Was sollen wir an dieser Stelle tun? Da das Problem noch offen ist, kann es sicher sein, die Warnung vorerst wegzulassen, in der Hoffnung, dass die Anfragen antworten ...
Recommended Posts