2010-01-29 17 views
15

Estoy intentando que Django (por encima de GAE) obtenga datos de otro servicio web. A menudo me golpeó con error como este:¿Cómo configurar el tiempo de espera para urlfetch en Google App Engine?

ApplicationError: 2 timed out Request

Method: GET

Request URL: http://localhost:8080/

Exception Type: DownloadError

Exception Value: ApplicationError: 2 timed out

Exception Location: /google_appengine/google/appengine/api/urlfetch.py in _get_fetch_result, line 325

Se siente como si se agotará el tiempo sólo después de 12 segundos (no estoy seguro, pero es muy corto).

Pregunta: ¿cómo puedo establecer un tiempo de espera más largo?

Respuesta

23

Puede configurarlo utilizando el argumento deadline del fetch function. De the docs:

The deadline can be up to a maximum of 60 seconds for request handlers and 10 minutes for tasks queue and cron job handlers. If deadline is None, the deadline is set to 5 seconds.


Editar: se parece a esto ha cambiado ahora. De here:

You can set a deadline for a request, the most amount of time the service will wait for a response. By default, the deadline for a fetch is 5 seconds. You can adjust the default deadline for requests using the urlfetch.set_default_fetch_deadline() function.

Y this page se muestran los valores de tiempo de espera por defecto:

Currently, there are several errors named DeadlineExceededError for the Python runtime:

  • google.appengine.runtime.DeadlineExceededError : raised if the overall request times out, typically after 60 seconds, or 10 minutes for task queue requests.
  • google.appengine.runtime.apiproxy_errors.DeadlineExceededError : raised if an RPC exceeded its deadline. This is typically 5 seconds, but it is settable for some APIs using the 'deadline' option.
  • google.appengine.api.urlfetch_errors.DeadlineExceededError : raised if the URLFetch times out.
+0

Ok, ¿puedo saber por qué decidió responder a la pregunta usando Java cuando el OP indicó claramente que estaba usando Django? No proporcionó el equivalente de Python :( – kassold

+0

Alguien más había editado mi respuesta dos años después de que la di y la agregó en un fragmento de código de Java por alguna razón ... si mira los hipervínculos en la primera línea, enlazan a la documentación de Python. De todos modos, hay un ejemplo de Python dado en la respuesta de Alex Young. –

+0

Los documentos que vinculan ya no incluyen ninguna mención de un máximo de 60 segundos. ¿Ha quedado obsoleta esa limitación? – conradlee

-1

Parece corta, pero hay que saber que el tiempo de espera de una consulta a GAE es de unos 30 segundos. Como probablemente necesite hacer algunas operaciones sobre la respuesta de su urlfetch, no hay necesidad de tener un tiempo de espera de más de 10 segundos, creo.

27

Dado que esta es una pregunta Python, pensé que podría proporcionar una respuesta de Python para cualquier persona que se encuentre con este problema.

Sólo tiene que importar urlfetch y luego definir una fecha límite antes de hacer cualquier otra cosa en su código:

from google.appengine.api import urlfetch 

urlfetch.set_default_fetch_deadline(60) 
+0

Agregado en [Versión 1.5.3] (http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes#Version_1.5.3_-_August_17,_2011) –

7

Para Ir, es posible que desee probar a continuación código.

// createClient is urlfetch.Client with Deadline 
func createClient(context appengine.Context, t time.Duration) *http.Client { 
    return &http.Client{ 
     Transport: &urlfetch.Transport{ 
      Context: context, 
      Deadline: t, 
     }, 
    } 
} 

Así es cómo usarlo.

// urlfetch 
client := createClient(c, time.Second*60) 
+0

Me doy cuenta de que este comentario es de 2013 pero la API ha cambiado y urlfetch, Transport ya no tiene una fecha límite. Para establecer la fecha límite, configúrela en el contexto utilizando: 'ctx, _: = context.WithDeadline (context, time.Second * 60)'. El problema con este enfoque es que usted también o limitar el tiempo disponible para todas las solicitudes posteriores. Lo que quiero decir es que si encuesta bigquery en una tarea (que tiene un tiempo de espera de 10 minutos) y establece la fecha límite en 60 segundos, realmente está limitando el período de votación a 60 segundos ya que la fecha límite se establece en el contexto establecido en el cliente pasó a BigQuery. – gabrielf