1

我正在尝试使用 Beaker 的缓存库,但无法正常工作。

这是我的测试代码。

class IndexHandler():
    @cache.cache('search_func', expire=300)
    def get_results(self, query):
        results = get_results(query)
        return results

    def get(self, query):
        results = self.get_results(query)
        return render_index(results=results)

我已经尝试过 Beaker 文档中的示例,但我看到的只是

<type 'exceptions.TypeError'> at /
can't pickle generator objects

显然我错过了一些东西,但我找不到解决方案。

顺便说一下,如果缓存类型设置为“文件”,则会出现此问题。

4

3 回答 3

3

如果您将烧杯配置为保存到文件系统,您可以很容易地看到每个参数也被腌制了。例子:

tp3
sS'tags <myapp.controllers.tags.TagsController object at 0x103363c10> <MySQLdb.cursors.Cursor object at 0x103363dd0> apple'
p4

请注意,缓存“key”不仅包含我的关键字“apple”,还包含特定于实例的信息。这很糟糕,因为特别是“自我”在调用中不会相同。缓存每次都会导致丢失(并且会被无用的键填满。)

带有缓存注释的方法应该具有与您想到的任何“键”相对应的参数。解释一下,假设您想要存储“John”对应于值 555-1212 的事实,并且您想要缓存它。您的函数不应将字符串以外的任何内容作为参数。你传入的任何参数都应该在调用之间保持不变,所以像“self”这样的东西会很糟糕。

完成这项工作的一种简单方法是内联该函数,这样您就不需要传递除密钥之外的任何其他内容。例如:

def index(self):

    # some code here

    # suppose 'place' is a string that you're using as a key. maybe
    # you're caching a description for cities and 'place' would be "New York"
    # in one instance

    @cache_region('long_term', 'place_desc')
    def getDescriptionForPlace(place):
      # perform expensive operation here
      description = ...
      return description

    # this will either fetch the data or just load it from the cache
    description = getDescriptionForPlace(place)

您的缓存文件应类似于以下内容。请注意,只有“place_desc”和“John”被保存为键。

tp3 
sS'place_desc John' 
p4
于 2011-01-02T17:04:33.760 回答
1

尝试return list(results)代替, return results看看它是否有帮助。

烧杯文件缓存需要能够腌制缓存键和值;大多数迭代器和生成器都是不可腌制的。

于 2010-07-10T16:47:55.253 回答
1

我看到beaker文档没有明确提到这一点,但是,很明显,装饰函数必须腌制它被调用的参数(用作缓存中键的一部分,检查条目是否存在并稍后添加它,否则) - 并且,生成器对象不可腌制,正如错误消息告诉您的那样。这意味着query是一个生成器对象。

为了使用烧杯或任何其他类型的缓存,您应该做的是传递,而不是生成器对象,可以构建查询query的(pickleable) ——字符串、数字、字典、列表、元组,parameters等等,等等,以任何易于安排的方式组成,并且易于从“及时”构建查询,仅在get_results. 这样,参数将是可腌制的,并且缓存将起作用。

如果方便,您可以构建一个简单的 pickleable 类,其实例“代表”查询,模拟您需要的任何初始化和参数设置,并仅在调用需要实际查询对象的某些方法时执行即时实例化。但这只是一个“方便”的想法,并没有改变上一段中解释的基本概念。

于 2010-07-03T16:05:31.287 回答