Question

J'utilise le serveur web Tornado et que vous voulez profiter de la mise en cache statique pour un résultat de requête asynchrone. Python, il est facile d'envelopper une fonction avec un cache de quelque sorte, par exemple en utilisant un décorateur:

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

Cependant, il devient rapidement complexe en utilisant le passage de continuation:

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)

La solution la plus élégante, je peux penser à faire des suppositions au sujet exige des signatures d'appel, ce qui est pas toujours pratique. Quelqu'un peut-il penser à une façon plus agréable?

Était-ce utile?

La solution

Utilisez Deferreds . (L'absence d'une telle abstraction est l'une des raisons pour lesquelles Tornado est considérablement inférieure à Twisted. Vous pouvez consulter Cyclone pendant que vous y êtes.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top