2010-01-29 3 views
15

Sto provando ad avere Django (in cima a GAE) per recuperare i dati da un altro servizio web. Sono spesso colpito con errore come questo:Come impostare il timeout per urlfetch in 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

Ci si sente come se essa scada solo dopo 12 secondi (non sono sicuro, ma è davvero breve).

Domanda: come posso impostare un timeout più lungo?

risposta

23

È possibile impostarlo utilizzando l'argomento deadline dello fetch function. Da 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.


Edit: assomiglia a questo ora è cambiato. Da 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.

E this page elenca i valori di timeout di default:

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, posso sapere perché hai deciso di rispondere alla domanda usando Java quando l'OP ha chiaramente affermato che sta usando Django? Non hai fornito l'equivalente Python :( – kassold

+0

Qualcun altro ha modificato la mia risposta due anni dopo averlo dato e aggiunto in uno snippet di codice Java per qualche motivo ... se si guardano i collegamenti ipertestuali nella prima riga, si collegano a la documentazione di Python C'è comunque un esempio di Python dato nella risposta di Alex Young. –

+0

I documenti a cui si fa riferimento non includono più alcuna menzione di un massimo di 60 secondi.Questa limitazione è stata deprecata? – conradlee

-1

sembra breve, ma si deve sapere che il timeout di una richiesta su GAE è di circa 30 secondi. Poiché probabilmente hai bisogno di fare alcune operazioni sulla risposta del tuo urlfetch, non c'è bisogno di avere un timeout più di 10 secondi, penso.

27

Considerando che questa è una domanda Python, ho pensato di fornire una risposta Python per chiunque si imbattesse in questo problema.

Basta importare urlfetch e quindi definire una scadenza prima di fare qualsiasi altra cosa nel codice:

from google.appengine.api import urlfetch 

urlfetch.set_default_fetch_deadline(60) 
+0

Aggiunto in [Versione 1.5.3] (http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes#Version_1.5.3_-_August_17,_2011) –

7

Per Go, si potrebbe desiderare di provare sotto il codice.

// 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, 
     }, 
    } 
} 

Ecco come utilizzarlo.

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

Mi rendo conto che questo commento è del 2013 ma l'API è stata modificata e urlfetch, Transport non ha più una scadenza Per impostare la scadenza, impostala sul contesto usando: 'ctx, _: = context.WithDeadline (context, time.Second * 60)'. Il problema con questo approccio è che tu o limitare il tempo disponibile per tutte le richieste successive. Quello che voglio dire è che se si esegue il polling di bigquery in un'attività (che ha un timeout di 10 minuti) e si imposta la scadenza a 60 secondi si limita realmente il periodo di polling a 60 secondi da quando la scadenza è impostata sul contesto impostato sul il cliente è passato a BigQuery. – gabrielf