bob*_*obo 4 python google-app-engine
我正在测试我的应用程序(在Google App Engine实时服务器上)和我编写它的方式我在我的代码中有大约40个db.GqlQuery()语句(主要是类的一部分).
我经常不断地获得db.Timeout .
我该如何处理?我打算用这样残酷的代码包围我的所有查询:
querySucceeded = False
while not querySucceeded :
try :
result = db.GqlQuery( """xxx""" ).get()
querySucceeded = True #only get here if above line doesn't raise exc
except :
querySucceeded = False
这个可以吗?你同意吗?处理db.Timeouts的更好方法是什么?
我现在用它来获取任何查询
""" Query gets single result """
def queryGet( gql ) :
querySucceeded = False
while not querySucceeded :
try :
result = db.GqlQuery( gql ).get()
querySucceeded = True #only get here if above line doesn't raise
except :
querySucceeded = False
return result
我有类似的fetch和count函数.
这是一个重装db.Timeout的装饰器,改编自Kay框架中的一个:
import logging, time
from google.appengine.ext import db
def retry_on_timeout(retries=3, interval=1.0, exponent=2.0):
"""A decorator to retry a given function performing db operations."""
def _decorator(func):
def _wrapper(*args, **kwargs):
count = 0
while True:
try:
return func(*args, **kwargs)
except db.Timeout, e:
logging.debug(e)
if count >= retries:
raise e
else:
sleep_time = (exponent ** count) * interval
logging.warning("Retrying function %r in %d secs" %
(func, sleep_time))
time.sleep(sleep_time)
count += 1
return _wrapper
return _decorator
Run Code Online (Sandbox Code Playgroud)
要使用它,只需装饰执行db操作的任何函数,并且您想要重试:
@retry_on_timeout()
def do_the_stuff(models):
return db.put(models)
Run Code Online (Sandbox Code Playgroud)
查询偶尔会失败.您可以向用户显示错误消息,也可以重试,如上所述.但是,如果重试,则应该使用thread.sleep在每次重试时添加越来越多的延迟(从50ms开始) - 如果不尽快重试,则重试更有可能成功.
但是,每个请求40个查询很多.您应该考虑重构代码 - 必须能够消除大部分代码!
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |