Python多进程批量读取大文件时顺序执行未并行问题求解
问题根因
你的代码没有实现并行的核心问题是:在for循环内每次仅给pool.map()传递1个文件的列表。pool.map()是阻塞方法,必须等传入的所有任务执行完成才会返回结果,所以你相当于每次只提交1个任务、等执行完再提交下一个,自然就是串行执行。
修复代码
你不需要循环逐个提交任务,直接把所有文件的列表一次性传给pool.map()即可,进程池会自动调度10个进程并行处理,最多同时跑10个任务,自动排队分配剩下的文件:
import multiprocessing import pandas as pd import glob def process(fileread): print(multiprocessing.current_process()) return pd.read_csv(fileread, header=None, sep=r'\s\s+|,', engine='python') if __name__ == '__main__': pool = multiprocessing.Pool(10) # 一次性获取所有dat文件列表,直接传给map批量提交 file_list = sorted(glob.glob("*.dat")) # 所有结果会按文件列表的顺序返回,你可以后续自行处理 results = pool.map(process, file_list) # 遍历输出结果 for res in results: print(res) pool.close() pool.join()
补充说明
- 如果你不需要等所有结果返回再处理,想拿到一个结果就处理一个,可以把
pool.map()换成pool.imap_unordered(),返回结果的顺序和文件提交顺序无关,处理完就返回,效率更高。 - 代码里的正则分隔符建议加
r前缀标记为原始字符串,避免转义字符异常。
内容的提问来源于stack exchange,提问作者avi
相关产品推荐
相关产品推荐

