2010-09-07 20 views
0

J'expérimente avec l'interface d'extraction d'URL asynchrone. Mais lorsque les rappels sont utilisés dans l'environnement de production, j'obtiens une AssertionError.Existe-t-il des limites à ce que vous pouvez faire dans les rappels de récupération d'URL asynchrones?

Est-ce dû à l'accès au magasin de données dans la fonction de rappel? Quelles sont les limites de la fonction de rappel? Existe-t-il d'autres API qui ne peuvent pas s'exécuter de manière asynchrone?

est ici la pile ...

('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',)) 
Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 513, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 153, in post 
    self.get() 
    File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 182, in get 
    bus.aggregateBusesAsynch(smsBody,self.request.get('SmsSid'),self.request.get('From')) 
    File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 296, in aggregateBusesAsynch 
    rpc.wait() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 460, in wait 
    self.__rpc.Wait() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 112, in Wait 
    rpc_completed = self._WaitImpl() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 108, in _WaitImpl 
    rpc_completed = _apphosting_runtime___python__apiproxy.Wait(self) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 171, in __MakeCallDone 
    self.__Callback() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 161, in __Callback 
    self.callback() 
    File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 265, in <lambda> 
    return lambda: handle_result(rpc,stopID,routeID,sid,directionID) 
    File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 252, in handle_result 
    stop.put() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 893, in put 
    return datastore.Put(self._entity, rpc=rpc) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 291, in Put 
    'datastore_v3', 'Put', req, datastore_pb.PutResponse(), rpc) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 194, in _MakeSyncCall 
    rpc.wait() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 461, in wait 
    assert self.__rpc.state == apiproxy_rpc.RPC.FINISHING, repr(self.state) 
InterruptedError: ('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',)) 
+1

Votre rappel est-il appelé après la fin de la requête? Par exemple, votre script principal a-t-il fini d'être exécuté lorsque ce code est exécuté? –

+0

Je ne suis pas certain en fait ... Y at-il un truc où je peux le forcer à attendre tous les rappels? Je préfère ne pas appeler les attentes dans une boucle for car ils peuvent revenir dans n'importe quel ordre. – Greg

+0

finalement revenu à regarder ce problème .... vous aviez raison, nick. J'essayais d'exécuter le rappel après la fin de la requête. La récupération d'URL asynchrone est une fonctionnalité intéressante. Je voudrais avoir découvert cela plus tôt. – Greg

Répondre

0

Ajouter ma propre réponse juste pour fermer ceci ...

Nick avait raison. J'ai essayé d'exécuter les rappels après la demande avait terminé. Je n'utilisais pas les appels d'attente correctement.