docs: def Put(self, message, block=True, timeout=1000):
      """Put a message on the queue, blocking if it is too full.
  
      Blocks when the queue contains more than the threshold.
  
      Args:
        message: rdf_flows.GrrMessage The message to put.
        block: bool If True, we block and wait for the queue to have more space.
          Otherwise, if the queue is full, we raise.
        timeout: int Maximum time (in seconds, with 1 sec resolution) we spend
          waiting on the queue.
  
      Raises:
        queue.Full: if the queue is full and block is False, or
          timeout is exceeded.
      """
      # We only queue already serialized objects so we know how large they are.
      message = message.SerializeToString()
  
      if not block:
        if self.Full():
          raise queue.Full
  
      else:
        t0 = time.time()
        while self.Full():
          time.sleep(1)
          self._heart_beat_cb()
  
          if time.time() - t0 > timeout:
            raise queue.Full
  
      with self._lock:
        self._queue.appendleft(message)
        self._total_size += len(message)