2010-01-07 13 views
11

Czy ktoś ma jakieś doświadczenie z następującym wyjątkiem podczas korzystania z urletch GAE?GoogleAppEngine limit czasu oczekiwania na wyjątek

 DownloadError: ApplicationError: 2 timed out 

Próbuję wysłać żądanie HTTP POST. Podobnie jak:

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

Próbowałem ustawić ostateczny termin na maksymalny (10 sekund). Żądanie z wiersza poleceń (używając curl lub httplib2) trwa około sekundy.

 [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 

Oto wyjście z appserver dev dla curl życzenie (używam AppEngine-Rest-serwer):

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 

tu jest wyjście, gdy próbuję użyć 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

Moje bieżące obejście polega na owinięciu wywołania urlfetch w bloku try/except pass. – nafe

+0

Czy możesz sprawdzić, co dzieje się na serwerze podczas tej rozmowy? Czy poprawnie przetwarza ładunek i zwraca klucz? Czy wartość w postdata jest taka, jak myślisz? –

+0

Witaj Alex, serwer otrzymuje żądanie POST i tworzy nowe Obj na podstawie połączenia. – nafe

Odpowiedz

12

Serwer WWW dla rozwoju jest jednowątkowy. Nie możesz złożyć wniosku do swojej aplikacji działającej wewnątrz niego. Spróbuj uruchomić dwa wystąpienia na różnych portach.

Nawiasem mówiąc, nie powinno to stanowić problemu po wdrożeniu, ponieważ faktyczny serwer AppEngine jest oczywiście w stanie obsłużyć wiele jednoczesnych żądań.

+0

Ah to brzmi jak bardzo obiecująca linia zapytania. Wypróbuję to i skontaktuję się z tobą. Dzięki! – nafe

+2

To _really_ shoudl być w dokumentach. – bobobobo

+0

To był dokładnie problem. Dzielenie nadawcy i odbiorcy urlfetch na oddzielne serwery rozwiązało mój problem. – nafe

Powiązane problemy