2010-12-02 6 views
1

J'utilise le serveur web Tornado et je veux 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:Manière élégante de mettre en cache la requête asynchrone en Python?

@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 I peut penser à faire des hypothèses sur les signatures d'appel, ce qui n'est pas toujours pratique. Quelqu'un peut-il penser à une façon plus agréable?

+0

Pour ce que ça vaut, ce que vous appelez "suite passant "ici est en réalité" callback passing ". Continuing passing nécessite que les suites de support de langue, ce que Python ne fait pas (au moins, pas hors de la boîte). – Glyph

Répondre

1

Utilisez Deferreds. (L'absence d'une telle abstraction est l'une des raisons pour lesquelles Tornado est nettement inférieur à Twisted.)

Questions connexes