Исключение таймаута выборки URL-адреса GoogleAppEngine
-
19-09-2019 - |
Вопрос
Есть ли у кого-нибудь опыт работы со следующим исключением при использовании GAE urlfetch?
DownloadError: ApplicationError: 2 timed out
Я пытаюсь отправить HTTP POST-запрос.Вот так:
result = urlfetch.fetch('http://api.nathan.com:8080/Obj/',
method='POST',
payload=postdata,
deadline=10)
Я попытался установить максимальный крайний срок (10 секунд).Запрос из командной строки (с использованием curl или httplib2) занимает около секунды.
nchong@almond ~ $ 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
Вот выходные данные от dev appserver для запроса curl (я использую 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
Вот результат, когда я пытаюсь использовать 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 -
Решение
Веб-сервер разработки является однопоточным.Вы не можете отправить запрос из вашего приложения, запущенного внутри него, самому себе.Попробуйте запустить два экземпляра на разных портах.
Кстати, это не должно стать проблемой после его развертывания, поскольку фактический сервер AppEngine, конечно, способен обрабатывать несколько одновременных запросов.