def parallel_preprocess(
    input_data, preprocess_pipeline, word_tokenize=None, num_pool=-1
):
    """
    Process data in parallel using multiple CPUs.

    Args:
        input_data (list): List if input strings to process.
        preprocess_pipeline (list): List of functions to apply on the input data.
        word_tokenize (func, optional): A tokenization function used to tokenize
            the results from preprocess_pipeline.
        num_pool (int, optional): Number of CPUs to use. Defaults to -1 and all
            available CPUs are used.

    Returns:
        list: list of processed text strings.

    """
    if num_pool == -1:
        num_pool = cpu_count()

    num_pool = min(num_pool, len(input_data))

    p = Pool(num_pool)

    results = p.map(
        partial(
            _preprocess,
            preprocess_pipeline=preprocess_pipeline,
            word_tokenize=word_tokenize,
        ),
        input_data,
        chunksize=min(1, int(len(input_data) / num_pool)),
    )
    p.close()
    p.join()

    return results

    Process data in parallel using multiple CPUs.

    Args:
        input_data (list): List if input strings to process.
        preprocess_pipeline (list): List of functions to apply on the input data.
        word_tokenize (func, optional): A tokenization function used to tokenize
            the results from preprocess_pipeline.
        num_pool (int, optional): Number of CPUs to use. Defaults to -1 and all
            available CPUs are used.

    Returns:
        list: list of processed text strings.

    
utils_nlp/models/transformers/datasets.py