code: def make_work_parcels(upload_workers, num_chunks):
          
          chunks_per_worker = int(math.ceil(float(num_chunks) / float(upload_workers)))
          return ParallelChunkProcessor.divide_work(range(num_chunks), chunks_per_worker)
docs: Make groups so we can split up num_chunks into similar sizes.
          Rounds up trying to keep work evenly split so sometimes it will not use all workers.
          For very small numbers it can result in (upload_workers-1) total workers.
          For example if there are two few items to distribute.
          :param upload_workers: int target number of workers
          :param num_chunks: int number of total items we need to send
          :return [(index, num_items)] -  an array of tuples where array element will be in a separate process.