首页 > 解决方案 > 每个进程池工作者的进度条的 Tqdm

问题描述

我要完成的任务是在多核机器上处理数千个不同大小的工件。我希望使用进程池执行器来分配作业并让每个工作人员告诉我它正在处理哪个文件。

到目前为止,我有以下内容:

from concurrent.futures import ProcessPoolExecutor

from itertools import islice, cycle

import time
import tqdm
import multiprocessing
import random

worker_count = min(multiprocessing.cpu_count(), 10)
flist=range(100)
executor = ProcessPoolExecutor(max_workers=worker_count)

with tqdm.tqdm(total=len(flist), leave=False) as t:
    t.set_description_str("Extracting ... ")
    pbars = []

    for idx in range(t.pos + 1, t.pos + 1 + worker_count):
        pbars.append(tqdm.tqdm(position=idx, bar_format='{desc}', leave=False))

    def process(entry):
        artifact, idx = entry
        time.sleep(random.randint(0, worker_count)/10.0)
        pbars[idx].set_description_str(f'Working on {artifact}', refresh=True)
        return artifact
    for _, _ in zip(flist, executor.map(process, zip(flist, islice(cycle(range(worker_count)), len(flist))))):
        t.update()

    for idx in range(worker_count):
        pbars[idx].set_description_str(" "*(pbars[idx].ncols - 1), refresh=True)
        pbars[idx].clear()
        pbars[idx].close()

运行演示

当然,我将显示文件名而不是数字。

现在,问题是:

  1. 有没有更好的pythonic方法来实现我想要的?
  2. 关于清除 pbars 的最后一点对我来说似乎令人讨厌。我这样做基本上是为了在程序完成时清理终端。也许有更好的方法?

标签: pythonpython-3.xtqdm

解决方案


推荐阅读