[Twisted-Python] Caching mechanism

mardiros mardiros at laposte.net
Sun Nov 15 15:53:12 EST 2009


Hi,

you can couple a decorator with the maybeDeferred function.
this is a trivial example but it works.
This cache is not cleaned and if you write your decorator in
a class with a __call__ function, you can isolate the cache
dictionary and a configurable lifetime, with a
twisted.internet.task.LoopingCall for this.
In fact, I have already talk about it in a previous message,
too try talking about this technique with more advanced
users than me without answer. I supposed it was not so bad.
Well, I am using now this kind of code to cache sql select
request from a twisted.enterprise.adbapi.ConnectionPool.runQuery
and it's work fine.



from twisted.internet import defer
from twisted.internet import reactor
import types

cache = {}
def memoize(f):
    def g(*args, **kwargs):
        key = (tuple(args), frozenset(kwargs.items()))
       
        if key not in cache:
            return f(*args, **kwargs)
        else:
            print "from cache"
            return cache[key]
    return g

def saveInCache(result,key):
    print "saving to cache"
    cache[key] = result
    return result

@memoize
def asynchronousIsValidUser(user):
    print "Loading from network"
    d = defer.Deferred()
    reactor.callLater(2, d.callback, user in ["Alice", "Angus", "Agnes"])
    return d.addCallback(saveInCache, ( (user,), frozenset() ))

def printResult(result,user):
    if result:
        print "User", user ,"is authenticated"
    else:
        print "User", user ,"is not authenticated"

def authenticateUser(user):
    print "Authenticating user ", user
    d = defer.maybeDeferred(asynchronousIsValidUser, user)
    return d.addCallback(printResult,user)


reactor.callWhenRunning(authenticateUser,"Alice")
reactor.callLater(1,authenticateUser,"Alice")
reactor.callLater(3,authenticateUser,"Alice")
reactor.callLater(5,reactor.stop)
reactor.run()




vitaly at synapticvision.com a écrit :
>
> Caching the results of some particular method calls, so other server  
> side methods can access those results (I'm thinking about example of  
> global variable per entire server, so once imported, such variable  
> content could be access).
>
>
>
> Quoting exarkun at twistedmatrix.com:
>
>   
>> On 05:41 pm, vitaly at synapticvision.com wrote:
>>     
>>> hi,
>>> is there any cache mechanism for twisted? Could one point me please to
>>> that docs?
>>>       
>> What sort of caching are you interested in?  Caching the results of
>> method calls?  A caching HTTP proxy?  Caching in the DNS client?  The
>> total list of possibilities could run to many pages. :)
>>
>> Jean-Paul
>>
>> _______________________________________________
>> Twisted-Python mailing list
>> Twisted-Python at twistedmatrix.com
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>>
>>     
>
>
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>   





More information about the Twisted-Python mailing list