【问题标题】:How can I create a variable that is scoped to a single request in app engine?如何在应用引擎中创建一个范围为单个请求的变量?
【发布时间】:2009-06-08 00:08:03
【问题描述】:

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

我以为我可以为此使用 python 全局或模块级变量,但事实证明,这些变量以不明显的方式在请求之间保持状态。

我也不认为 memcache 有意义,因为它是应用程序范围的。

我无法在谷歌的文档中找到一个好的答案。也许那是因为它要么是一个愚蠢的想法,要么是完全显而易见的,但它似乎很有用,我被难住了。

有人有什么想法吗?

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    我通常做的只是在请求对象上创建一个新属性。但是,我使用 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"]))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        模块变量可能(或可能不会)在请求之间持续存在(同一个应用程序实例可能在请求之间保持活动状态,也可能不保持活动状态),但您可以在处理请求的开始,或者当你知道你完成了一个请求时。在最坏的情况下(如果您的代码组织得特别好),您需要设置一些函数以始终在每次请求开始或每次请求结束时执行。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-04
            • 1970-01-01
            相关资源
            最近更新 更多