code: def block_on_batch(self, job_id, batch_id, sleep_time_seconds=5, max_wait_time_seconds=-1):
          
          if not job_id or not batch_id or not self.has_active_session():
              raise Exception("Can not block on a batch without a valid batch_id, job_id and an active session.")
  
          start_time = time.time()
          status = {}
          while max_wait_time_seconds < 0 or time.time() - start_time < max_wait_time_seconds:
              status = self._get_batch_info(job_id, batch_id)
              logger.info("Batch %s Job %s in state %s.  %s records processed.  %s records failed." %
                          (batch_id, job_id, status['state'], status['num_processed'], status['num_failed']))
              if status['state'].lower() in ["completed", "failed"]:
                  return status
              time.sleep(sleep_time_seconds)
  
          raise Exception("Batch did not complete in %s seconds.  Final status was: %s" % (sleep_time_seconds, status))
docs: Blocks until @batch_id is completed or failed.
          :param job_id:
          :param batch_id:
          :param sleep_time_seconds:
          :param max_wait_time_seconds: