concurrent.futures - biblioteca de Python - la mejor manera de aprovechar la función a continuación

1

Tengo una función a continuación, que itera a través de un depósito aws s3 para capturar valores en cada archivo y pasarlos al cuerpo para una solicitud de API. Hay muchas solicitudes de API por archivo y muchos archivos, ¿entonces la función es la siguiente? ¿Cómo puedo aprovechar mejor esta función junto con la biblioteca concurrente en Python, para realizar una solicitud al mismo tiempo, mientras se itera adecuadamente a través de los nuevos valores en el archivo y los nuevos archivos dentro de s3?

def clean_adresses(url,unload_bucket,cleaned_bucket):
    

    pages = sgv.paginator.paginate(Bucket=glob_common_vars.s3_bucket_name, Prefix=unload_bucket)
    
    
    final_output = []
    for page in pages:
        for obj in page['Contents']:
            addresses = glob_common_vars.s3_resource.Object(glob_common_vars.s3_bucket_name,obj['Key'])
            with gzip.GzipFile(fileobj=addresses.get()["Body"]) as gzipfile:
                addresses = ndjson.loads(gzipfile.read().decode('utf-8'))
            addresses_len = len(addresses)
            b = 0
            batch_num = 0
            while b < addresses_len:
                a = b
                b = b + 100
                final_addresses = addresses[a:b]
                
                response = requests.request("POST", url, json=final_addresses)
                
                resp_data = response.json()
                print(resp_data)
                final_output.extend(resp_data)
            
                if len(final_output) > 10000:
                    gec.ndjson_to_s3(final_output, glob_common_vars.s3_resource, glob_common_vars.s3_bucket_name, cleaned_bucket + str(batch_num)  + '.json.gzip')
                    batch_num +=1 
                    final_output = []
    print(final_output)                
    gec.ndjson_to_s3(final_output, glob_common_vars.s3_resource, glob_common_vars.s3_bucket_name, cleaned_bucket  +  str(batch_num) + '.json.gzip')

Así es como estoy comenzando, pero me pregunto cómo puedo manejar la iteración a través de "direcciones", es decir, [a: b] y los nuevos archivos, sin hacer una solicitud redundante.

with concurrent.futures.ThreadPoolExecutor(max_workers = 5) as executor:
            future_cleaned_addresses = {executor.submit(clean_adresses,.....?