显示没有tqdm的多处理脚本的状态

问题描述 投票:0回答:1

我正在编写我的第一个多处理脚本,此后必须将其转换为可执行文件。我想概述一下列表中有多少文件已被处理。但是,如果我使用tqdm来执行此操作,我的可执行文件将变得非常大。因此,我正在寻找一种解决方案,以使您印象深刻,该任务仍在运行多长时间。不管是进度条还是控制台中的输出,如“ 120个文件中的10个已完成”,都没有关系。有没有人提示如何执行此操作?我必须将多个参数a,b,c,d,e传递给多处理工具,因此我还必须使用“ partial”。然后,我为每个处理的文件获得一个返回值。这是我的代码如何工作而不显示进度状态:

import multiprocessing
from functools import partial

pool = multiprocessing.Pool(multiprocessing.cpu_count())
prod_x=partial(doSomething, a=a, b=b, c=c, d=0, e=e)
totalResult= list((pool.imap_unordered(prod_x, listOfFiles)))

doSomething-Function计算某些内容,并为每个文件完成此操作。参数totalResult是所有返回值的列表

python multiprocessing progress-bar
1个回答
0
投票

处理此问题的最直接的方法,可能是使用pool.apply_async来分派您的工作。然后,您需要定义一个回调,以在每次作业完成时执行。

如果要通知用户当前已执行了多少个作业,则回调需要到目前为止已执行的作业数的“内存”。这可以是全局变量,也可以是我认为更可取的类。

结合这些观点,解决方案可能类似于:

import multiprocessing
import time


class ProgressUpdater:
    def __init__(self, num_items):
        self.num_items = num_items
        self.num_processed = 0

    def update(self, data):
        self.num_processed += 1
        print(f"Done processing {self.num_processed} of {self.num_items} inputs")


def func(item):
    time.sleep(item // 10)
    return item // 2


if __name__ == "__main__":
    item_list = [3, 5, 7, 32, 6, 21, 12, 1, 7]
    progress_updater = ProgressUpdater(len(item_list))

    with multiprocessing.Pool(3) as pool:
        result_objects = [
            pool.apply_async(func, (item,), callback=progress_updater.update)
            for item in item_list
        ]
        results = [result_object.get() for result_object in result_objects]
    pool.join()

    print(results)

现在,为了满足您的需要,您需要通过使用partial功能等进行稍微按摩。>>

© www.soinside.com 2019 - 2024. All rights reserved.