gpt4 book ai didi

python-3.x - 并行进程覆盖进度条 (tqdm)

转载 作者:行者123 更新时间:2023-12-03 16:13:14 66 4
gpt4 key购买 nike

我正在用 Python 3.7 编写一个脚本,该脚本使用 multiprocessing.Process 启动多个并行任务(每个内核的任务)。为了跟踪每个进程的进度,我使用了库 tqdm它实现了一个进度条。我的代码如下所示:

with tqdm(total=iterator_size) as progress_bar:
for row in tqdm(batch):
process_batch(batch)
progress_bar.update(1)

进度条确实会相应更新,但由于多个进程运行上面的代码,每个进程都会覆盖控制台上的进度条,如下面的屏幕截图所示。

enter image description here

完成后,控制台正确显示完成的进度条:

enter image description here

我的目标是让进度条更新而不会相互覆盖。有没有办法实现这一目标?

一种可能的解决方案是只在需要最长的进程上显示进度条(我事先知道哪个是),但最好的情况是根据第二张图片为每个进程更新一个。

全部解决方案在线地址 multiprocess.Pool ,但我不打算改变我的架构,因为我可以充分利用 multiprocess.Process .

最佳答案

要在不覆盖的情况下进行更新,您需要使用 position tqdm的参数,你可以找到here .在这里,position=0对于最外面的条形,position=1对于下一个,依此类推,其中 0 和 1 是打印进度条之前要跳过的行数,即 0 表示 0 行之后的进度条,1 表示 1 行之后的进度条。如 position需要跳过的行数,它需要我们可以使用 multiprocessing.current_process 获得的进程的索引

(注意:不要输入 pid 数字,因为它会在打印前跳过那么多行)

from multiprocessing import current_process

""" Your code Here
Here, the current_process() is the process object
current_process().name gives the name of the process
current_process()._identity gives a tuple of the number of process
"""

current = current_process()
with tqdm(total=iterator_size) as progress_bar:
for row in tqdm(batch, desc=str(current.name),
position=current._identity[0] - 1)):
process_batch(batch)
progress_bar.update(1)

关于python-3.x - 并行进程覆盖进度条 (tqdm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56683373/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com