2017-07-13 2 views
0

J'utilise le module grequests pour effectuer des requêtes asynchrones. En testant le morceau de code suivant montre basé sur ANOMALIE valeur TIMEOUT:grequests renvoyant le type 'None' même après l'utilisation de exception_handler

>>> grequests.map((grequests.get('http://httpbin.org/delay/1',timeout=0.6),),exception_handler=exception_handler) 
failed: http://httpbin.org/delay/1 

[<Response [200]>] 
>>> grequests.map((grequests.get('http://httpbin.org/delay/1', timeout=0.001),),exception_handler=exception_handler) 
failed: http://httpbin.org/delay/1 

[None] 

Alors, comment est la valeur du délai d'attente affectant l'exécution de la dernière partie de exception_handling?

>>> def exception_handler(r,e): 
     print('failed: ',r.url,'\n') 
     #changing the url just for doing sth 
     r.url = 'http://httpbin.org/status/200' 
     res = r.send().response 
     return res 

Répondre

0

Je pense que la raison pour laquelle vous est seulement changé le url de r, mais vous ne l'avez pas modifié le timeout de celui-ci. La valeur de timeout est stockée dans self.kwargs.

Selon le defination:

""" Asynchronous request. 
    Accept same parameters as ``Session.request`` and some additional: 
    :param session: Session which will do request 
    :param callback: Callback called on response. 
        Same as passing ``hooks={'response': callback}`` 
    """ 
    def __init__(self, method, url, **kwargs): 
     #: Request method 
     self.method = method 
     #: URL to request 
     self.url = url 
     #: Associated ``Session`` 
     self.session = kwargs.pop('session', None) 
     if self.session is None: 
      self.session = Session() 

     callback = kwargs.pop('callback', None) 
     if callback: 
      kwargs['hooks'] = {'response': callback} 

     #: The rest arguments for ``Session.request`` 
     self.kwargs = kwargs 
     #: Resulting ``Response`` 
     self.response = None 

la valeur de timeout est stockée dans self.kwargs. Et il n'a pas changé lorsque vous avez modifié la valeur url stockée dans self.url dans exception_handler.