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