2010-01-29 12 views
15

Ich versuche, Django (über GAE) Daten von einem anderen Webdienst abzurufen. Ich bin oft mit Fehlern wie folgt getroffen:Wie Zeitüberschreitung für Urlfetch in Google App Engine festlegen?

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

Es fühlt sich an, als ob es erst nach 12 Sekunden Zeitüberschreitung wird (Ich bin nicht sicher, aber es ist wirklich kurz).

Frage: Wie kann ich ein längeres Timeout einstellen?

Antwort

23

Sie können es mit dem deadline Argument der fetch function setzen. Von 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: sieht wie folgt nun geändert hat. Von 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.

Und this page listet die Standard-Timeout-Werte:

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, darf ich wissen, warum Sie sich entschieden haben, die Frage mit Java zu beantworten, als das OP klar erklärte, dass er Django benutzt? Du hast das Python-Äquivalent nicht zur Verfügung gestellt :( – kassold

+0

Jemand anderes hatte meine Antwort zwei Jahre nach meiner Eingabe bearbeitet und aus irgendeinem Grund ein Java-Code-Snippet hinzugefügt ... wenn du dir die Hyperlinks in der ersten Zeile ansiehst, verlinken sie auf Die Python-Dokumentation Es gibt ein Python-Beispiel, das in Alex Youngs Antwort hier trotzdem angegeben wird –

+0

Die Dokumente, auf die Sie verlinken, enthalten keine Erwähnung von maximal 60 Sekunden. Wurde diese Einschränkung als veraltet betrachtet? – conradlee

-1

Es scheint kurz, aber man muss wissen, dass das Timeout eines Antrags auf GAE beträgt etwa 30 Sekunden. Da Sie wahrscheinlich einige Operationen auf die Antwort Ihres Urlfetch durchführen müssen, ist es nicht notwendig, ein Timeout von mehr als 10 Sekunden zu haben, denke ich.

27

Da dies eine Python Frage ist, dachte ich, ich würde eine Python-Antwort für jeden zur Verfügung stellen, der auf dieses Problem stößt.

Nur urlfetch importieren und dann eine Frist festlegen, bevor irgendetwas anderes in Ihrem Code zu tun:

from google.appengine.api import urlfetch 

urlfetch.set_default_fetch_deadline(60) 
+0

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

7

Für Go, möchten Sie vielleicht Code unten, um zu versuchen.

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

Hier ist, wie Sie es verwenden.

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

Ich realisiere, dass dieser Kommentar von 2013 ist, aber die API hat sich geändert und urlfang, Transport hat keine Frist mehr Um den Termin festzulegen, setzen Sie ihn stattdessen auf den Kontext: 'ctx, _: = context.WithDeadline (context, time.Second * 60)'. Das Problem bei diesem Ansatz ist, dass Sie auch o die verfügbare Zeit für alle nachfolgenden Anfragen begrenzen. Was ich meine ist, dass, wenn Sie BigQuery in einer Aufgabe abfragen (die eine 10 Minuten Zeitüberschreitung hat) und die Deadline auf 60 Sekunden setzt, begrenzen Sie den Abfragezeitraum auf 60 Sekunden, da die Deadline auf den Kontext gesetzt ist, der auf der Client wurde an BigQuery übergeben. – gabrielf