Я использую веб-сервер 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)
Самое элегантное решение, которое я могу придумать, требует предположений о сигнатурах вызовов, что не всегда практично. Кто-нибудь может придумать более хороший способ?