我正在做一些并行处理,如下所示:
with mp.Pool(8) as tmpPool:
results = tmpPool.starmap(my_function, inputs)
其中输入如下所示: [(1,0.2312),(5,0.52) ...] 即 int 和 float 的元组。
代码运行良好,但我似乎无法将其包装在加载栏(tqdm)上,例如可以使用 imap 方法来完成,如下所示:
tqdm.tqdm(mp.imap(some_function,some_inputs))
可以这也适用于星图吗?
谢谢!
是的,你可以将
starmap
与
tqdm
结合使用以获取进度条。但是,你不能直接像
imap
那样将
starmap
传递给
tqdm
。你必须迭代可迭代对象并手动更新进度条。
以下是如何使用
starmap
和
tqdm
实现此目标的方法:
from tqdm import tqdm
import multiprocessing as mp
def my_function(int_val, float_val):
# 在这里放置你的函数逻辑
# 例如:
result = int_val * float_val
return result
if __name__ == '__main__':
inputs = [(1, 0.2312), (5, 0.52), (3, 0.9)] # 示例输入
num_processes = 8
with mp.Pool(num_processes) as pool:
results = list(tqdm(pool.starmap(my_function, inputs), total=len(inputs)))
print(results)
说明:
-
迭代和
tqdm
: 我们使用pool.starmap()
在输入元组上并行执行my_function
。pool.starmap()
返回一个迭代器,我们将其传递给tqdm
以创建进度条。 -
total
参数: 我们向tqdm
提供total
参数,该参数设置为输入元组inputs
的长度。这使进度条能够准确跟踪完成的迭代次数。 -
list()
转换: 我们使用list()
将tqdm
的输出转换为列表,这会强制立即执行所有计算。
此设置将在处理输入时显示进度条。
其他选项:
-
你还可以探索
tqdm
的chunksize
参数,以通过一次性将更多工作项传递给工作进程来优化性能,从而减少开销。
请记住,并行处理的开销可能超过小型任务的收益,因此最好评估它在你的特定情况下是否提供显着的速度提升。
标签:python,multiprocessing,python-multiprocessing,tqdm,process-pool From: 57354700