[Twisted-Python] maybeDeferred capability

As I am still a new user of Twisted, I have decide to use the maybeDeferred capability. The real aim is to cache sql queries, but I have written this example from the twisted mayneDeferred doc. I am happy with my code, but, I would like to share it to have some feed back Here it is: --- import types from datetime import datetime, timedelta from twisted.internet import defer from twisted.internet import reactor, task class asyncmemoize: def __init__(self, function,pool_time=10,cachelifetime=10): self.function = function self._cache = {} self._cachelifetime = timedelta(0,cachelifetime) self._cleaner = task.LoopingCall(self.cleanCache) self._cleaner.start(pool_time,now=False) self._cleanrun = False def __call__(self, *args, **kwargs): key = (tuple(args), frozenset(kwargs.items())) if key not in self._cache: f = self.function(*args, **kwargs).addCallback(self.callback,key) self._cache[key]=[datetime.today(), f] else: print "from cache" return self._cache[key][1] def callback(self,result,key): print "Put real value in cache" self._cache[key]=[datetime.today(), self._cachelifetime, result] return result def cleanCache(self): if not self._cleanrun: self._cleanrun = True print 'Clean the cache...' #log.msg('Clean the persistent cache...', logLevel=logging.DEBUG) expire = datetime.today() i = 0 for k,v in self._cache.items(): print v[0], "<", expire, "=>", v[0] > expire if v[0] < expire: i+=1 del self._cache[k] print '%i items removed' % i #log.msg('%i items removed' % i, logLevel=logging.DEBUG) self._cleanrun = False def saveInCache(result,key): print "saving to cache" cache[key] = result return result @asyncmemoize def asynchronousIsValidUser(user): print "Loading is authenticating from async" d = defer.Deferred() reactor.callLater(2, d.callback, user in ["Alice", "Angus", "Agnes"]) return d def synchronousIsValidUser(user): ''' Return true if user is a valid user, false otherwise ''' return user in ["Alice", "Angus", "Agnes"] def printResult(result,user): if result: print "User", user ,"is authenticated" else: print "User", user ,"is not authenticated" def authenticateUser(isValidUser, user): print "Authenticating user ", user d = defer.maybeDeferred(isValidUser, user) return d.addCallback(printResult,user) authenticateUser(asynchronousIsValidUser,"Alice") reactor.callLater(3,authenticateUser,asynchronousIsValidUser,"Alice") reactor.callLater(5,authenticateUser,asynchronousIsValidUser,"Alice") reactor.callLater(15,authenticateUser,asynchronousIsValidUser,"Alice") reactor.callLater(30,authenticateUser,asynchronousIsValidUser,"Alice") reactor.run() ---------------------------------------------------------------------------- Laposte.net fête ses 10 ans ! Gratuite, garantie à vie et déjà utilisée par des millions d'internautes... vous aussi, pour votre adresse e-mail, choisissez laposte.net. Laposte.net, bien + qu'une messagerie ----------------------------------------------------------------------------
participants (1)
-
mardiros