docs: def Convert(self, values, start_index=0, end_index=None):
      """Converts given collection to exported values.
  
      This method uses a threadpool to do the conversion in parallel. It
      blocks for up to one hour until everything is converted.
  
      Args:
        values: Iterable object with values to convert.
        start_index: Start from this index in the collection.
        end_index: Finish processing on the (index - 1) element of the collection.
          If None, work till the end of the collection.
  
      Returns:
        Nothing. ConvertedBatch() should handle the results.
      """
      if not values:
        return
  
      try:
        total_batch_count = len(values) // self.batch_size
      except TypeError:
        total_batch_count = -1
  
      pool = ThreadPool.Factory(self.threadpool_prefix, self.threadpool_size)
      val_iterator = itertools.islice(values, start_index, end_index)
  
      pool.Start()
      try:
        for batch_index, batch in enumerate(
            collection.Batch(val_iterator, self.batch_size)):
          logging.debug("Processing batch %d out of %d", batch_index,
                        total_batch_count)
  
          pool.AddTask(
              target=self.ConvertBatch,
              args=(batch,),
              name="batch_%d" % batch_index,
              inline=False)
  
      finally:
        pool.Stop(join_timeout=3600)