¿Cómo usar tqdm a través de múltiples procesos en python?

Estoy tratando de usar tqdm través de múltiples procesos. Y el comportamiento no es el esperado. Creo que el punto es que el valor de pbar no se actualiza a través de los procesos. Entonces, ¿cómo lidiar con este problema? También he intentado usar Value para actualizar pbar.n manualmente, pero aún así pbar.n fallado. Parece que tqdm no admite el valor de actualización y el renderizado manualmente.

 def test(lock, pbar): for i in range(10000): sleep(0.1) lock.acquire() pbar.update() lock.release() pbar = tqdm(total = 10000) lock = Lock() for i in range(5): Process(target = test, args = (lock, pbar)) 

Generalmente, cada proceso tiene sus propios datos, independientemente de cualquier otro proceso. La creación de un nuevo proceso (que llama a os.fork en Unix) crea una copia del proceso actual. Cada proceso obtiene su propia copia de todos los valores globales (como pbar ). Las variables globales de cada proceso pueden compartir los mismos nombres que las variables en los otros procesos, pero cada una puede tener un valor independiente.

En su caso, parece que usted quiere que solo pbar un pbar , y todas las llamadas a update deberían actualizar ese pbar . Así que cree pbar en un solo proceso, y use una Queue para enviar señales a ese proceso para actualizar pbar :

 import multiprocessing as mp SENTINEL = 1 def test(q): for i in range(10000): sleep(0.1) q.put(SENTINEL) def listener(q): pbar = tqdm(total = 10000) for item in iter(q.get, None): pbar.update() if __name__ == '__main__': q = mp.Queue() proc = mp.Process(target=listener, args=(q,)) proc.start() workers = [mp.Process(target=test, args=(q,)) for i in range(5)] for worker in workers: worker.start() for worker in workers: worker.join() q.put(None) proc.join()