首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Flask缓存与生成器函数一起使用

将Flask缓存与生成器函数一起使用
EN

Stack Overflow用户
提问于 2013-01-05 05:21:14
回答 1查看 407关注 0票数 1

我正在尝试使用Flask-Cache来缓存生成器函数。Flask-Cache需要酸洗,因为生成器不能酸洗,这是一个问题。在Flask-Cache中使用生成器有什么变通方法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-01-05 12:48:29

如果您想缓存结果,只需在生成器上调用list并存储结果即可。如果结果太大而不能安全地存储在内存中(即使是临时的),那么将结果包装在一个可以restore itself when unpickled的类实例中

代码语言:javascript
复制
# Warning: This is terribly tightly bound together
# There are better ways to do this - this is just by way of example

def some_generator(identifier):
    """This could be anything
        * A database wrapper
        * A permutation generator
        * Something that streams (and transforms) data from disk
        * The possibilities are endless"""
    if identifier == "result_set_1":
        results = [(x, y) for x in range(10) for y in range(x)]
    elif identifier == "result_set_2":
        results = [(x, 0) for x in range(20)]
    else:
        results = [(1, 2), (3, 4)]

    for row in results:
        yield row


class GeneratorWrapper(object):
    """
    Use::

        @cache
        some_function(identifier):
            return GeneratorWrapper(identifier)
    """

    def __init__(self, identifier=None):
        self.identifier = identifier
        if identifier is not None:
            self.data = some_generator(identifier)

    def __getstate__(self):
        """When pickled return the key to rebuilding the generator"""
        return self.identifier

    def __setstate__(self, state):
        """When unpickled, restore the generator using the pickled key"""
        self.identifier = state
        if state is not None:
            self.data = some_generator(state)

    def __iter__(self):
        return self.data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14165167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档