def get(self, block=1): if block: self.esema.acquire() elif not self.esema.acquire(0): raise Empty self.mutex.acquire() was_full = self._full() item = self._get() if was_full: self.fsema.release() if not self._empty(): self.esema.release() self.mutex.release() return item