decrement the counter, waiting if it is already at 0

        .. note::

            if the counter is already at 0, this method will block the current
            coroutine until a :meth:`release` increments it again.

        :param blocking:
            whether or not to block if the counter is already at 0 (default
            ``True``)
        :type blocking: bool

        :returns:
            a bool, indicating whether the count was decremented (this can only
            be ``False`` if ``blocking`` was ``False`` -- otherwise it would
            have blocked until it could decrement the counter)

def acquire(self, blocking=True):
        """decrement the counter, waiting if it is already at 0

        .. note::

            if the counter is already at 0, this method will block the current
            coroutine until a :meth:`release` increments it again.

        :param blocking:
            whether or not to block if the counter is already at 0 (default
            ``True``)
        :type blocking: bool

        :returns:
            a bool, indicating whether the count was decremented (this can only
            be ``False`` if ``blocking`` was ``False`` -- otherwise it would
            have blocked until it could decrement the counter)
        """
        if self._value:
            self._value -= 1
            return True
        if not blocking:
            return False
        self._waiters.append(compat.getcurrent())
        scheduler.state.mainloop.switch()
        return True