2010-01-07 1 views
11

Hat jemand Erfahrung mit der folgenden Ausnahme bei der Verwendung von GAE Urlfetch?GoogleAppEngine Urlfetch Timeout Ausnahme

 DownloadError: ApplicationError: 2 timed out 

Ich versuche, eine HTTP-POST-Anfrage zu senden. Wie so:

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

Ich habe versucht, Frist bis zum Maximum (10 Sekunden) einzustellen. Die Anfrage von der Kommandozeile (mit curl oder httplib2) dauert ungefähr eine Sekunde.

 [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 

Hier ist die Ausgabe von dem Entwickler appserver für die curl Anfrage (Ich verwende appengine-rest-Server):

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 

Hier ist der Ausgang, wenn ich versuche urlfetch zu verwenden:

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

Meine aktuelle Problemumgehung besteht darin, den Aufruf von urlfetch in einen Test/Except-Pass-Block zu verpacken. – nafe

+0

Können Sie während dieses Anrufs sehen, was auf dem Server passiert? Verarbeitet es die Payload korrekt und gibt den Schlüssel zurück? Ist der Wert in postdata, was Sie denken, dass es ist? –

+0

Hallo Alex, der Server bekommt die POST-Anfrage und es erstellt ein neues Obj basierend auf dem Anruf. – nafe

Antwort

12

Der Entwicklungs-Webserver ist single-threaded. Sie können keine Anfrage von Ihrer Anwendung an sie selbst senden. Versuchen Sie, zwei Instanzen auf verschiedenen Ports auszuführen.

Übrigens sollte dies kein Problem sein, sobald es implementiert wurde, da der eigentliche AppEngine-Server natürlich mehrere gleichzeitige Anforderungen verarbeiten kann.

+0

Ah, das klingt nach einer vielversprechenden Fragestellung. Ich werde es ausprobieren und zu dir zurückkommen. Vielen Dank! – nafe

+2

Dieser _really_ shouldl in den Dokumenten sein. – bobobobo

+0

Das war genau das Problem. Durch das Aufteilen des Absenders und des Empfängers der Urlfetch auf separaten Servern wurde mein Problem gelöst. – nafe