【问题标题】:Alternative to singleton?单例的替代品?
【发布时间】:2010-11-17 19:37:18
【问题描述】:

我是 Python 和 App Engine(和服务器端!)新手,我正在尝试创建非常简单的 CMS。应用程序的每个部署都将有一个 - 并且只有一个 -company 对象,实例化如下:

class Company(db.Model):
    name = db.StringPropery()
    profile = db.TextProperty()
    addr = db.TextProperty() 

我正在尝试提供更新公司资料和其他详细信息的便利。

我的第一个想法是拥有一个公司实体单例。但是看了this thread(虽然还远未完全理解),我觉得这样做很困难,也不可取。

然后我想,也许对于 CMS 的每个部署,我都可以一次性运行一个脚本(由一个完全不知名的 URL 触发),它只是实例化 Company。从那时起,我将通过theCompany = Company.all()[0]获得这个实例

这是可取的吗?

然后我记得那个帖子中的某个人建议只使用一个模块。所以我只是创建了一个 Company.py 文件并在其中插入了一些变量。我已经在 SDK 中尝试过这个,它似乎可以工作 - 令我惊讶的是,修改后的变量值在请求之间“存活”了。

请原谅我的无知,但是,我假设这些值只保存在内存中,而不是保存在磁盘上 - 不像 Datastore 的东西?这是一个强大的解决方案吗? (模块变量是否会在我的应用程序脚本的所有调用范围内?)

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    全局变量是“app-cached”。这意味着您的应用程序的每个 特定实例将在请求之间记住这些变量的值。但是,当实例关闭时,这些值将丢失。因此,我不认为您真的想将这些值存储在模块级变量中(除非它们是不需要更新的常量)。

    我认为您的原始解决方案可以正常工作。您甚至可以使用remote API 工具创建原始实体,这样您就不需要一个晦涩的页面来实例化唯一的Company 对象。

    如果您通过键检索单例Company 实体,也可以加快检索它的速度。

    如果您需要经常检索此实体,则可以使用缓存技术避免往返数据存储。最快的方法是在您从数据存储区检索到 Company 实体后对其进行应用缓存。为了防止实体变得过时,您还可以应用缓存您上次检索实体的时间,如果该时间超过 N 秒,那么您可以从数据存储区重新获取它。有关此选项的更多详细信息以及它与其他选项的比较,请查看 Nick Johnson 的文章 Storage options on App Engine

    【讨论】:

      【解决方案2】:

      听起来您正在尝试为您的应用提供一种可在每个应用程序基础上进行配置的方法。

      为什么不使用数据存储来存储带有 key_name 的公司实体?然后,您将始终知道如何获取公司实体,并且无需重新部署即可编辑公司。

      company = Company(key_name='c')
      # set stuff on company....
      company.put()
      
      # later in code...
      company = Company.get_by_key_name('c')
      

      使用memcache 存储公司的详细信息,避免重复调用数据存储区。

      除了 memcache,您还可以使用模块变量来缓存值。如您所见,它们是cached,在请求之间。

      【讨论】:

        【解决方案3】:

        我认为你读到的方法是最简单的:

        • 使用模块变量,在None中初始化。
        • 为这些变量提供访问器(get/setter)。
        • 当一个变量被访问时,如果它的值为None,从数据库中获取它。否则,只需使用它。

        这样,您将拥有由模块提供的应用程序范围的变量(不会一次又一次地实例化),它们将被共享并且您不会丢失它们。

        【讨论】:

        • 由于 Dave 提到实体可能会被修改,因此可能值得跟踪上次从数据存储中获取实体的时间,并在经过一段时间后重新获取它。这将确保实体的应用缓存副本与规范数据存储值不同步的时间有一定上限。
        猜你喜欢
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多