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

Sra*_*raw 8 python multiprocessing python-3.x tqdm

我正试图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))
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 7

通常,每个进程都有自己的数据,与其他进程无关.产生一个新进程(os.fork在Unix 上调用)会创建当前进程的副本.每个进程都获得自己的所有全局值的副本(例如 pbar).每个进程的全局变量可以与其他进程中的变量共享相同的名称,但每个进程可以包含一个独立的值.

在您的情况下,看起来您只想pbar存在一个,并且所有调用都 update应该更新那个pbar.因此pbar,只在一个进程中创建,并使用a 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()
Run Code Online (Sandbox Code Playgroud)

  • 它工作得很好,除了在 `proc.join()` 处永远阻塞。我认为可以通过在 `proc.join()` 之前添加 `q.put(None)` 来完成侦听器进程来解决。多谢。 (2认同)