Исключение тайм-аута URL-адреса GoogleAppEngine

Есть ли у кого-нибудь опыт работы со следующим исключением при использовании urlfetch GAE?

      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

Вот вывод сервера приложений для запроса 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 -

person nafe    schedule 07.01.2010    source источник
comment
Мой текущий обходной путь - заключить вызов urlfetch в блок try / except pass.   -  person nafe    schedule 07.01.2010
comment
Можете ли вы посмотреть, что происходит на сервере во время этого звонка? Правильно ли он обрабатывает полезную нагрузку и возвращает ключ? Является ли значение постданных таким, как вы думаете?   -  person Adam Crossland    schedule 07.01.2010
comment
Привет, Алекс! Сервер получает запрос POST и создает новый объект Obj на основе вызова.   -  person nafe    schedule 07.01.2010
comment
Значит, он завершает ответ?   -  person Adam Crossland    schedule 07.01.2010
comment
Возможно, одна из сложностей заключается в том, что я использую один и тот же экземпляр приложения (с разными обработчиками) как для запроса API, так и для ответа API. Я попробую разделить их, чтобы увидеть, какой из них не работает.   -  person nafe    schedule 07.01.2010
comment
Да! Сервер приложений для разработчиков является однопоточным! Он никогда не сможет выполнить запрос к самому себе.   -  person Adam Crossland    schedule 07.01.2010
comment
Обратите внимание, что максимальный тайм-аут больше не равен 10 секундам: крайний срок может составлять максимум 60 секунд для обработчиков запросов и 10 минут для очереди задач и обработчиков заданий cron. Если крайний срок отсутствует, крайний срок устанавливается на 5 секунд. Рассмотрите возможность редактирования вашего вопроса :)   -  person proppy    schedule 26.04.2012


Ответы (1)


Веб-сервер разработки является однопоточным. Вы не можете сделать запрос от своего запущенного внутри него приложения к самому себе. Попробуйте запустить два экземпляра на разных портах.

Между прочим, это не должно быть проблемой после его развертывания, поскольку фактический сервер AppEngine, конечно, может обрабатывать несколько одновременных запросов.

person Adam Crossland    schedule 07.01.2010
comment
Ах, это звучит как очень многообещающее направление расследования. Я попробую и вернусь к вам. Спасибо! - person nafe; 08.01.2010
comment
Именно в этом и заключалась проблема. Разделение отправителя и получателя urlfetch на отдельные серверы решило мою проблему. - person nafe; 15.01.2010