Как повторить попытку urlfetch.fetch еще несколько раз в случае ошибки? - PullRequest
5 голосов
/ 04 мая 2011

Довольно часто GAE не может загрузить файл, и я получаю следующую ошибку:

ApplicationError: 2
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 636, in __call__
    handler.post(*groups)
  File "/base/data/home/apps/picasa2vkontakte/1.348093606241250361/picasa2vkontakte.py", line 109, in post
    headers=headers
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 260, in fetch
    return rpc.get_result()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 592, in get_result
    return self.__get_result_hook(self)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 355, in _get_fetch_result
    raise DownloadError(str(err))
DownloadError: ApplicationError: 2

Как мне выполнить повторные попытки в случае такой ошибки?

        try:
            result = urlfetch.fetch(url=self.request.get('upload_url'), 
                                    payload=''.join(data),
                                    method=urlfetch.POST,
                                    headers=headers
                                    )
        except DownloadError:
            # how to retry 2 more times?
        # and how to verify result here?

1 Ответ

9 голосов
/ 04 мая 2011

Если можете, переместите эту работу в очередь задач .Когда задачи не выполняются, они повторяются автоматически.Если они продолжают отказывать, система постепенно сбрасывает частоту повторения до такой же низкой скорости, как один раз в час.Это простой способ обработки запросов API к службам с ограниченной скоростью без реализации одноразовой логики повторения.

Если вам действительно нужно обрабатывать запросы синхронно, должно работать что-то вроде этого:

for i in range(3):
  try:
    result = urlfetch.fetch(...)
    # run success conditions here
    break
  except DownloadError:
    #logging.debug("urlfetch failed!")
    pass

Вы также можете передать deadline=10 в urlfetch.fetch, чтобы удвоить установленный по умолчанию срок ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...