code: def upload_async(data_service_auth_data, config, upload_id,
                   filename, index, num_chunks_to_send, progress_queue):
      
      auth = DataServiceAuth(config)
      auth.set_auth_data(data_service_auth_data)
      data_service = DataServiceApi(auth, config.url)
      sender = ChunkSender(data_service, upload_id, filename, config.upload_bytes_per_chunk, index, num_chunks_to_send,
                           progress_queue)
      try:
          sender.send()
      except:
          error_msg = "".join(traceback.format_exception(*sys.exc_info()))
          progress_queue.error(error_msg)
docs: Method run in another process called from ParallelChunkProcessor.make_and_start_process.
      :param data_service_auth_data: tuple of auth data for rebuilding DataServiceAuth
      :param config: dds.Config configuration settings to use during upload
      :param upload_id: uuid unique id of the 'upload' we are uploading chunks into
      :param filename: str path to file who's contents we will be uploading
      :param index: int offset into filename where we will start sending bytes from (must multiply by upload_bytes_per_chunk)
      :param num_chunks_to_send: int number of chunks of config.upload_bytes_per_chunk size to send.
      :param progress_queue: ProgressQueue queue to send notifications of progress or errors