def run_par()

in cc_net/dedup.py [0:0]


def run_par(processes):
    # This is different from multiprocessing.map since it allows for kwargs.
    processes = list(processes)
    if len(processes) == 1 or DISABLE_MULTI_PROCESSING:
        for f, args, kwargs in processes:
            f(*args, **kwargs)
        return

    log(f"Starting {len(processes)} subprocess")
    processes = [
        multiprocessing.Process(target=f, args=a, kwargs=kw) for (f, a, kw) in processes
    ]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    failed = 0
    for p in processes:
        if p.exitcode != 0:
            log(f"Process failed with code {p.exitcode}: {p}")
            failed += 1
    assert failed == 0, f"{failed} processes failed..."