我正在编写我的第一个多处理脚本,之后必须将其转换为可执行文件。我想了解一下列表中已经处理了多少文件。但是,如果我使用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函数计算一些东西,并对每个文件进行计算。参数totalResult是所有返回值的列表
处理此问题最直接的方法可能是使用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
功能等进行轻微按摩。