[Twisted-Python] Lock class using Deferreds
    Itamar Shtull-Trauring 
    itamar at itamarst.org
       
    Fri Mar  5 09:19:01 MST 2004
    
    
  
class Lock:
    """A lock for event driven systems."""
    def __init__(self):
        self.waiting = []
        self.locked = 0
    def acquire(self):
        """Attempt to acquire the lock.
        @return Deferred which returns on lock acquisition.
        """
        d = defer.Deferred()
        if self.locked:
            self.waiting.append(d)
        else:
            self.locked = 1
            d.callback(self)
        return d
    def release(self):
        """Release the lock.
        Should be called by whoever did the acquire() when the shared
        resource is free.
        """
        assert self.locked
        self.locked = 0
        if self.waiting:
            # someone is waiting to acquire lock
            self.locked = 1
            d = self.waiting.pop(0)
            d.callback(self)
    def _releaseAndReturn(self, r):
        self.release()
        return r
    
    def run(self, f, *args, **kwargs):
        """Acquire lock, run function, release lock.
        @return Deferred of function result.
        """
        d = self.acquire()
        d.addCallback(lambda r: defer.maybeDeferred(f, *args, **kwargs).addBoth(self._releaseAndReturn))
        return d
-- 
Itamar Shtull-Trauring    http://itamarst.org
Looking for a job: http://itamarst.org/resume.html
    
    
More information about the Twisted-Python
mailing list