如何在出错时重试urlfetch.fetch几次?
很多时候,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
如果可以的话,把这个工作放到任务队列里去做。当任务失败时,它会自动重试。如果一直失败,系统会逐渐降低重试的频率,慢到每小时才重试一次。这是一种简单的方法,可以处理那些有请求限制的服务,而不需要自己写复杂的重试逻辑。
如果你真的需要同步处理请求,可以试试下面这样的代码:
for i in range(3):
try:
result = urlfetch.fetch(...)
# run success conditions here
break
except DownloadError:
#logging.debug("urlfetch failed!")
pass
你还可以给urlfetch.fetch加上deadline=10
,这样可以把默认的超时时间加倍。