优雅的方式来缓存Python中的异步查询?

时间:2010-12-02 23:34:53

标签: caching asynchronous twisted decorator tornado

我正在使用Tornado Web服务器,并希望利用静态缓存来获取异步查询结果。 Python可以很容易地使用某种缓存包装函数,例如使用装饰器:

@cache.wrap(ttl=60)
def get_data(arg):
    return do_query(arg)

然而,使用延续传递很快就会变得复杂:

def wrap_static_result(key, result, callback, ttl):
    cache.set(key, result, ttl)
    callback(result)

def get_data(arg, callback):
    cached = cache.get(arg)
    if cached:
        callback(cached)
    else:
        callback2 = lambda result: wrap_static_result(arg, result, callback, ttl=60)
        do_async_query(arg, callback2)

我能想到的最优雅的解决方案需要对呼叫签名做出假设,这并不总是实用的。谁能想到更好的方式?

1 个答案:

答案 0 :(得分:1)

使用Deferreds。 (缺乏这样的抽象是龙卷风远远低于扭曲的原因之一。你可能想要在你看到它时查看Cyclone。)