Python使用multiprocessing多进程时如何显示tqdm进度条?
问题原因
你的写法不生效有两个核心问题:
pool.map()是阻塞方法,会等待所有子进程任务全部执行完成后才会一次性返回所有结果,此时再套tqdm相当于迭代一个已经完成的结果列表,自然看不到中间进度。total参数配置错误,你填写的os.cpu_count()是并行执行的进程上限,不是总任务数,总任务数应该是待处理的date列表长度,同时你代码里不小心把函数名写成了create_od,要改回你实际定义的create_data。
正确实现方案
用非阻塞的imap/imap_unordered方法逐次返回执行结果,就能实时更新进度条:
%%time from tqdm import tqdm from multiprocessing import Pool import pandas as pd import os # Windows系统必须加这行判断,否则多进程会报错 if __name__ == '__main__': with Pool(processes=os.cpu_count()) as pool: # 需要保持输入date和输出结果顺序一致时用imap results = list(tqdm(pool.imap(create_data, date), total=len(date), desc='任务执行进度')) # 不需要结果顺序时可以用imap_unordered,执行效率更高、进度更新更流畅 # results = list(tqdm(pool.imap_unordered(create_data, date), total=len(date), desc='任务执行进度')) data = [ent for sublist in results for ent in sublist] data = pd.DataFrame(data, columns = cols) data.to_csv(f"{str(date)}.csv", index=False)
注意事项
- 如果单个
create_data任务执行时间过长,可以考虑把date列表拆分为更小的子任务,避免进度条长时间卡在同一个进度点。 - 导出文件名建议补充
.csv后缀,避免生成无后缀的文件。
内容的提问来源于stack exchange,提问作者catris25
相关产品推荐
相关产品推荐

