1

Flask-Cache を使用してジェネレータ関数をキャッシュしようとしています。Flask-Cache は酸洗いを必要とし、ジェネレーターは酸洗いできないため、これは問題です。Flask-Cache でジェネレーターを使用するための回避策はありますか?

4

1 に答える 1

0

結果をキャッシュしたい場合は、ジェネレーターを呼び出しlistて、代わりにそれを保存してください。結果が大きすぎてメモリに安全に保存できない場合(一時的であっても)、選択を解除すると自分自身を復元できるクラスインスタンスに結果をラップします。

# 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
于 2013-01-05T04:48:28.720 に答える