docs: def get(self, block=True, timeout=None):
          """get an item out of the queue
  
          .. note::
  
              if `block` is ``True`` (the default) and the queue is
              :meth`empty`, this method will block the current coroutine until
              something has been :meth:`put`.
  
          :param block:
              whether to block if there is no data yet available (default
              ``True``)
          :type block: bool
          :param timeout:
              the maximum time in seconds to block waiting for data. with the
              default of ``None``, can wait indefinitely. this is unused if
              `block` is ``False``.
          :type timeout: int, float or None
  
          :raises:
              :class:`Empty` if there is no data in the queue and block is
              ``False``, or `timeout` expires
  
          :returns: something that was previously :meth:`put` in the queue
          """
          if not self._data:
              if not block:
                  raise Empty()
  
              current = compat.getcurrent()
  
              waketime = None if timeout is None else time.time() + timeout
              if timeout is not None:
                  scheduler.schedule_at(waketime, current)
              self._waiters.append((current, waketime))
  
              scheduler.state.mainloop.switch()
  
              if timeout is not None:
                  if not scheduler._remove_timer(waketime, current):
                      self._waiters.remove((current, waketime))
                      raise Empty()
  
          if self.full() and self._waiters:
              scheduler.schedule(self._waiters.popleft()[0])
  
          return self._get()