import multiprocessing import random import time import math import tqdm results = [] def task(position, lock): total_iterations = 10 process_idx = multiprocessing.current_process()._identity[0] with lock: bar = tqdm.tqdm( desc=f'Position {process_idx}', total=total_iterations, position=process_idx, leave=False ) for _ in range(total_iterations): time.sleep(random.uniform(0.01, 0.4)) with lock: bar.update(1) with lock: bar.close() return position def store_result(result): results.append(result) if __name__ == '__main__': lock = multiprocessing.Manager().Lock() pool_size = math.floor(multiprocessing.cpu_count()/2) with multiprocessing.Pool(pool_size) as pool: for position in range(20): pool.apply_async(task, args = (position + 1, lock), callback=store_result) pool.close() pool.join() print(results)