首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python多处理中更新共享的tqdm进度条

在python多处理中更新共享的tqdm进度条
EN

Stack Overflow用户
提问于 2022-11-06 04:55:06
回答 1查看 38关注 0票数 1

我想从生成的进程中更新一个进度条,如下所示:

代码语言:javascript
运行
复制
import multiprocessing as mp
import random
import time
from tqdm import tqdm

def test(queue, pbar, lock):
    while True:
        x = queue.get()
        if x is None:
            break
        for i in range(x):
            time.sleep(1)
            lock.acquire()
            pbar.update(1)
            lock.release()

queue = mp.Queue()
lock = mp.Lock()
processes = []
pbar = tqdm(total=5050)
for rank in range(4):
    p = mp.Process(target=test, args=(queue, pbar, lock))
    p.start()
    processes.append(p)
pbar.close()

for idx in range(100):
    queue.put(idx)

for _ in range(4):
    queue.put(None)  # sentinel values to signal subprocesses to exit

for p in processes:
        p.join()  # wait for all subprocesses to finish

上面提供了不一致的更新(进度是上下的)。我找到了这个answer,但是它们都不适合我,因为我想更新test函数中的进度条。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-06 09:15:44

我会稍微调整一下这个计划:

1.)创建update_bar进程,该进程创建进度条并从另一个队列值中读取,并使用以下值更新该条

2.)此更新过程具有daemon=True参数,因此在退出时不会阻塞

3.)如果test进程想要更新进度条,则在启动bar_queue时接收值,并将值放在那里。

代码语言:javascript
运行
复制
import time
from tqdm import tqdm
import multiprocessing as mp


def test(queue, bar_queue):
    while True:
        x = queue.get()
        if x is None:
            break
        for _ in range(x):
            time.sleep(0.05)
            bar_queue.put_nowait(1)


def update_bar(q):
    pbar = tqdm(total=188)

    while True:
        x = q.get()
        pbar.update(x)


if __name__ == "__main__":
    queue = mp.Queue()
    bar_queue = mp.Queue()

    processes = [
        mp.Process(target=test, args=(queue, bar_queue)) for _ in range(4)
    ]

    # start update progress bar process
    # daemon= parameter is set to True so this process won't block us upon exit
    bar_process = mp.Process(target=update_bar, args=(bar_queue,), daemon=True)
    bar_process.start()

    for p in processes:
        p.start()

    for idx in range(20):
        queue.put(idx)

    for _ in range(4):
        queue.put(None)  # sentinel values to signal subprocesses to exit

    for p in processes:
        p.join()  # wait for all subprocesses to finish

    time.sleep(0.5)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74333395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档