[PYTHON] ResourceWarning lors de l'utilisation de requêtes: solution de contournement non fermée

requêtes J'écrivais du code en utilisant 2.4.3 et j'ai reçu l'avertissement suivant:

ResourceWarning: unclosed <socket.socket ...>

Ou

ResourceWarning: unclosed <ssl.SSLSocket ...>

Il semble que l'on dise que la prise n'est pas fermée. ResourceWarning ne le fait généralement pas (ressemble à) car il est ignoré s'il n'est pas construit en mode débogage, mais je crains que cela se produise chaque fois que j'exécute un test unitaire. Surtout, je pensais que si la prise n'était pas vraiment fermée, il faudrait qu'elle soit correctement fermée.

Vérifier le problème dans le référentiel des demandes

Ce cas a déjà été signalé dans le numéro, alors jetons un œil là-bas. ResourceWarning in python 3.2+ #1882 J'ai l'impression de l'avoir écrémé

Il paraît que. Cela apparaît comme un avertissement si l'exécution du code se termine avant que le GC ne s'exécute dans un test unitaire, etc., mais cela ne semble pas être un réel problème. Sur cette base, nous examinerons les solutions de contournement qui peuvent être prises à l'heure actuelle.

Solution de contournement 1. Supprimer les avertissements

Il n'y a ni corps ni couvercle,

unittest.main(warnings='ignore')

Cela arrêtera l'avertissement. Quant à ce ResourceWarning, il dit:" L'avertissement est ennuyeux mais ce n'est pas symptomatique d'un problème. ", Vous pouvez donc l'ignorer, mais c'est une manière approximative d'éliminer tous les avertissements. y a-t-il….

Solution de contournement 2. Appelez Request.connection.close ()

En vous basant sur la solution de contournement signalée dans le problème ci-dessus, essayez de créer une classe qui peut être utilisée dans le bloc with.

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()

Utilisez comme suit.

with HttpWrapper(requests.get, 'http://...', auth=...) as result:
    #Traitement à l'aide du résultat

Cependant, cela signifie que le pool de connexions n'est pas du tout utilisé ...

Solution de contournement 3. Utilisez Session explicitement et appelez Session.close ()

C'est presque la même chose que la solution de contournement 2, mais basée sur la solution de contournement proposée dans le problème ci-dessus en tant que committer. Créons une classe qui peut être utilisée dans le bloc with.

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()

Utilisez comme suit.

with SessionManager(HttpMethod.get, 'http://...', auth=...) as result:
    #Traitement à l'aide du résultat

Cela signifie également que le pool de connexions n'est pas du tout utilisé ...

Conclusion (... n'est pas sorti)

Je pense que toutes les solutions de contournement ne sont pas assez bonnes ... Après tout, que devons-nous faire à ce stade? Étant donné que le problème est toujours ouvert, il peut être prudent de laisser l'avertissement pour le moment, en espérant que les demandes répondront ...

Recommended Posts

ResourceWarning lors de l'utilisation de requêtes: solution de contournement non fermée
Résumé lors de l'utilisation de Fabric
Précautions lors de l'utilisation de Chainer
Points (personnels) lors de l'utilisation de ctypes
Variables d'environnement lors de l'utilisation de Tkinter
Enregistrer des images à l'aide de requêtes python3
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
Lors de l'utilisation d'optparse avec iPython
Paramètres de DEBUG lors de l'utilisation de Django
Lors de l'utilisation si et lors de l'utilisation pendant
Structure de fichier lors de l'utilisation d'exigences python sans serveur
Utilisez configparser lors de l'utilisation de l'API
Lorsque vous souhaitez envoyer un objet avec des requêtes à l'aide de flask