Элегантный способ кеширования асинхронного запроса в Python? - PullRequest
1 голос
/ 03 декабря 2010

Я использую веб-сервер Tornado и хочу использовать статическое кэширование для результата асинхронного запроса. 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 Ответ

1 голос
/ 03 декабря 2010

Использование Отложено . (Отсутствие такой абстракции является одной из причин того, что Торнадо значительно уступает Twisted. Возможно, вы захотите проверить Циклон , пока вы там.)

...