【问题标题】:How to use tqdm through multi process in python?如何在python中通过多进程使用tqdm?
【发布时间】:2017-08-21 04:51:23
【问题描述】:

我正在尝试通过多个进程使用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))

【问题讨论】:

    标签: python python-3.x multiprocessing tqdm


    【解决方案1】:

    通常,每个进程都有自己的数据,独立于其他进程。 生成一个新进程(在 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()
    

    【讨论】:

    • 它运行良好,除了在proc.join() 永久阻止。我认为可以通过在proc.join() 之前添加q.put(None) 来完成侦听器过程来解决。非常感谢。
    • @Sraw:哎呀,你说得很对。谢谢指正。
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多