如何在app引擎中创建一个范围为单个请求的变量?

时间:2009-06-08 00:08:04

标签: python google-app-engine

我正在为谷歌应用引擎创建一个python应用程序,我遇到了一些性能问题,其中包含一些在单个请求中重复的昂贵操作。为了帮助解决这个问题,我想创建一种限定为单个请求的小型缓存。这与会话范围或应用程序范围的缓存相反,对我的特定问题都没有意义。

我认为我可以使用python全局变量或模块级变量,但事实证明那些变量在非显而易见的情况下维持它们之间的状态。

我也不认为memcache有意义,因为它适用于应用程序。

我无法在谷歌的文档中找到一个好的答案。也许这是因为它既是一个愚蠢的想法,也可能是一个完全明显的想法,但似乎它很有用而且我很难过。

有人有什么想法吗?

4 个答案:

答案 0 :(得分:2)

我通常只是在请求对象上创建一个新属性。但是,我使用django和AppEngine,所以我不确定appengine webapp框架是否有任何不同。

def view_handler(request):
    if hasattr(request, 'mycache'):
        request.mycache['counter'] += 1
    else:
        request.mycache = {'counter':1,}

    return HttpResponse("counter="+str(request.mycache["counter"]))

答案 1 :(得分:2)

如果您正在使用App Engine附带的“webapp”框架(或实际上,大多数其他WSGI-baesd框架),则会为每个请求实例化一个新的RequestHandler。因此,您可以在处理程序类上使用类变量来存储每个请求数据。

答案 2 :(得分:1)

模块变量可能(或可能不)在请求之间保持(相同的应用程序实例可能会或可能不会在请求之间保持活动状态),但您可以明确地清除它们(del或设置为None ,比如说)在你处理一个请求的开始,或者当你知道你已完成一个请求时。在最坏的情况下(如果您的代码是特殊组织的),您需要设置一些函数以始终在每个请求开始时执行,或者在每个请求结束时执行。

答案 3 :(得分:0)

使用本地列表存储数据,并在请求处理结束时执行model.put。保存多个数据库之旅