[Twisted-Python] Lock class using Deferreds
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
participants (3)
-
Andrew Bennetts
-
Christopher Armstrong
-
Itamar Shtull-Trauring