'Converts given collection to exported values.
This method uses a threadpool to do the conversion in parallel. It
blocks 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.'

def Convert(self, values, start_index=0, end_index=None):

    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(utils.Grouper(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()
