2010-01-07 21 views
11

¿Alguien ha tenido alguna experiencia con la siguiente excepción al usar GAE urlfetch?GoogleAppEngine urlfetch timeout exception

 DownloadError: ApplicationError: 2 timed out 

Estoy tratando de enviar una solicitud HTTP POST. Como tal:

 result = urlfetch.fetch('http://api.nathan.com:8080/Obj/', 
           method='POST', 
           payload=postdata, 
           deadline=10) 

He intentado establecer la fecha límite al máximo (10 segundos). La solicitud desde la línea de comando (usando curl o httplib2) toma alrededor de un segundo.

 [email protected] ~ $ time curl 
         -d "<Obj><a>1</a><b>n</b></Obj>" 
         http://api.nathan.com:8080/Obj/ 
     agd1c2VyYXBpcgoLEgRTZXNzGAIM  #< key returned by call 
     real 0m1.109s 
     user 0m0.003s 
     sys 0m0.009s 

Aquí está la salida desde el servidor de aplicaciones dev para la solicitud de rizo (estoy usando appengine-resto-servidor):

INFO  __init__.py:819] adding models from module __main__ 
INFO  __init__.py:867] added model Obj with type <class '__main__.Obj'> 
INFO  dev_appserver.py:3243] "POST /Obj HTTP/1.1" 200 - 
INFO  dev_appserver_index.py:205] Updating /path/to/index.yaml 

Aquí está la salida cuando trato de usar urlfetch:

ERROR __init__.py:388] ApplicationError: 2 timed out 
Traceback (most recent call last): 
    File "/path/to/webapp/__init__.py", line 507, in __call__ 
    handler.get(*groups) 
    File "/path/to/myapp/main.py", line 62, in get 
    result = urlfetch.fetch(...) 
    File "/path/to/urlfetch.py", line 241, in fetch 
    return rpc.get_result() 
    File "/path/to/apiproxy_stub_map.py", line 501, in get_result 
    return self.__get_result_hook(self) 
    File "/path/to/urlfetch.py", line 325, in _get_fetch_result 
    raise DownloadError(str(err)) 
DownloadError: ApplicationError: 2 timed out 
INFO  dev_appserver.py:3243] "GET/HTTP/1.1" 500 - 
INFO  dev_appserver.py:3243] "POST /Obj/ HTTP/1.1" 200 - 
+1

Mi solución actual es ajustar la llamada a urlfetch en un bloque try/except pass. – nafe

+0

¿Puede ver lo que está sucediendo en el servidor durante esta llamada? ¿Está procesando correctamente la carga y devolviendo la clave? ¿Es el valor en postdata lo que piensas que es? –

+0

Hola Alex, El servidor recibe la solicitud POST y está creando un Obj nuevo según la llamada. – nafe

Respuesta

12

El servidor web de desarrollo tiene un solo subproceso. No puede realizar una solicitud desde su aplicación ejecutándose dentro de ella. Intenta ejecutar dos instancias en diferentes puertos.

Por cierto, esto no debería ser un problema una vez que se implementa, ya que el servidor AppEngine real es, por supuesto, capaz de manejar múltiples solicitudes simultáneas.

+0

Ah, esto suena como una línea de investigación muy prometedora. Lo probaré y te responderé. ¡Gracias! – nafe

+2

Esto _really_ debería estar en los documentos. – bobobobo

+0

Este fue exactamente el problema. Dividir el remitente y el receptor del urlfetch en servidores separados resolvió mi problema. – nafe