code: def get(self, timeout=None, block=True):
          
          _vv and IOLOG.debug('%r.get(timeout=%r, block=%r)',
                              self, timeout, block)
          self._lock.acquire()
          try:
              if self.closed:
                  raise LatchError()
              i = len(self._sleeping)
              if len(self._queue) > i:
                  _vv and IOLOG.debug('%r.get() -> %r', self, self._queue[i])
                  return self._queue.pop(i)
              if not block:
                  raise TimeoutError()
              rsock, wsock = self._get_socketpair()
              cookie = self._make_cookie()
              self._sleeping.append((wsock, cookie))
          finally:
              self._lock.release()
  
          poller = self.poller_class()
          poller.start_receive(rsock.fileno())
          try:
              return self._get_sleep(poller, timeout, block, rsock, wsock, cookie)
          finally:
              poller.close()
docs: Return the next enqueued object, or sleep waiting for one.
  
          :param float timeout:
              If not :data:`None`, specifies a timeout in seconds.
  
          :param bool block:
              If :data:`False`, immediately raise
              :class:`mitogen.core.TimeoutError` if the latch is empty.
  
          :raises mitogen.core.LatchError:
              :meth:`close` has been called, and the object is no longer valid.
  
          :raises mitogen.core.TimeoutError:
              Timeout was reached.
  
          :returns:
              The de-queued object.