如何在python中通过多进程使用tqdm?

How to use tqdm through multi process in python?

我正在尝试通过多进程使用 tqdm。并且行为不符合预期。我认为关键是 pbar 的值不会通过进程更新。那么如何处理这个问题呢?我也试过用Value手动更新pbar.n,还是失败了。似乎tqdm不支持更新值和手动渲染。

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))

一般来说,每个进程都有自己的数据,独立于其他进程。 生成一个新进程(在 Unix 上调用 os.fork)创建一个副本 当前进程。每个进程都获得自己的所有全局值的副本(例如 pbar)。每个进程的全局变量可能与变量共享相同的名称 在其他进程中,但每个进程都可以拥有一个独立的值。

在您的情况下,您似乎只想存在一个 pbar,并且所有对 update 应该更新那个 pbar。所以只在一个进程中创建pbar, 并使用 Queue 向该进程发送信号以更新 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()