Frage

Ich bin mit Tornado-Webserver und mag die Vorteile von statischem Caching für ein asynchrones Abfrage-Ergebnis zu übernehmen. Python macht es einfach, eine Funktion mit einem Cache von einer Art zu verpacken, zum Beispiel eines Dekorateur mit:

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

es jedoch schnell bekommt Komplex mit Fortsetzung Gang:

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)

Die eleganteste Lösung, die ich denken kann, erfordert Annahmen über Call-Signaturen zu machen, die nicht immer praktikabel ist. Kann jemand eine schönere Art und Weise denken?

War es hilfreich?

Lösung

Verwenden Sie Deferreds . (Das Fehlen einer solchen Abstraktion ist einer der Gründe dafür, dass Tornado Twisted dramatisch schlechter ist. Möglicherweise möchten Sie Cyclone , während Sie gerade dabei sind).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top