python - 每个进程池工作者的进度条的 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()
当然,我将显示文件名而不是数字。
现在,问题是:
- 有没有更好的pythonic方法来实现我想要的?
- 关于清除 pbars 的最后一点对我来说似乎令人讨厌。我这样做基本上是为了在程序完成时清理终端。也许有更好的方法?
解决方案
推荐阅读
- wordpress - 使用 Genesis 的 Wordpress 多站点中的 Cookie
- django - Django 休息框架 RetrieveAPIView 不工作:404
- ios - iOS TableView 搜索时自动拖动
- ios - 使用图像选择器选择图像时,如果我多次点击我的视图控制器也会关闭
- c# - 没有获得面板的复选框控件值
- scrapy - 使用scrapy翻页并获取每个页面的图像的url,但回调方法不适用于我的想法
- android - 将任何节点索引到 Firebase 后,如何在 Android 中查询?我可以对超过 100k 个子节点使用 startAt() 和 EndAt() 函数吗?
- php - 在mysql和php中将数据从一个数据库移动到另一个数据库时出错
- java - 春云流兔的退避设置
- css - Bootstrap 4 将图像移出卡片标题的容器