[PYTHON] ResourceWarning bei Verwendung von Anforderungen: nicht geschlossene Problemumgehung

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.

Überprüfen Sie das Problem im Anforderungs-Repository

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.

Problemumgehung 1. Unterdrücken Sie Warnungen

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….

Problemumgehung 2. Rufen Sie Request.connection.close () auf.

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 ...

Problemumgehung 3. Verwenden Sie Session explizit und rufen Sie Session.close () auf.

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 ...

Fazit (... ist nicht rausgekommen)

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

ResourceWarning bei Verwendung von Anforderungen: nicht geschlossene Problemumgehung
Zusammenfassung bei Verwendung von Fabric
Vorsichtsmaßnahmen bei der Verwendung von Chainer
(Persönliche) Punkte bei Verwendung von ctypes
Umgebungsvariablen bei Verwendung von Tkinter
Speichern Sie Bilder mit Python3-Anforderungen
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Bei Verwendung von optparse mit iPython
DEBUG-Einstellungen bei Verwendung von Django
Bei Verwendung von if und bei Verwendung von while
Dateistruktur bei Verwendung von Serverless-Python-Anforderungen
Verwenden Sie configparser, wenn Sie die API verwenden
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten