code: def get_event(self, timeout=None, block=True):
          
          if not self._receivers:
              raise Error(self.empty_msg)
  
          event = Event()
          while True:
              recv = self._latch.get(timeout=timeout, block=block)
              try:
                  if isinstance(recv, Select):
                      event = recv.get_event(block=False)
                  else:
                      event.source = recv
                      event.data = recv.get(block=False)
                  if self._oneshot:
                      self.remove(recv)
                  if isinstance(recv, mitogen.core.Receiver):
                      # Remove in 0.3.x.
                      event.data.receiver = recv
                  return event
              except mitogen.core.TimeoutError:
                  # A receiver may have been queued with no result if another
                  # thread drained it before we woke up, or because another
                  # thread drained it between add() calling recv.empty() and
                  # self._put(). In this case just sleep again.
                  continue
docs: Fetch the next available :class:`Event` from any source, or raise
          :class:`mitogen.core.TimeoutError` if no value is available within
          `timeout` seconds.
  
          On success, the message's :attr:`receiver
          <mitogen.core.Message.receiver>` attribute is set to the receiver.
  
          :param float timeout:
              Timeout in seconds.
          :param bool block:
              If :data:`False`, immediately raise
              :class:`mitogen.core.TimeoutError` if the select is empty.
          :return:
              :class:`Event`.
          :raises mitogen.core.TimeoutError:
              Timeout was reached.
          :raises mitogen.core.LatchError:
              :meth:`close` has been called, and the underlying latch is no
              longer valid.