如何反转multiprocessing的pool任务执行顺序,从新到旧处理数据?
解决反转多进程任务执行顺序的问题
要实现从最新到最旧处理数据,核心就是反转输入文件列表的遍历顺序,然后按这个反转后的顺序提交apply_async任务。这里给你两种直接可行的方案:
方案一:反转索引范围(适合依赖索引生成输出文件名的场景)
如果你的循环是通过索引i遍历allfiles,且输出文件名outfname是基于索引生成的,直接反转索引的遍历范围即可:
# 把原来的for i in range(len(allfiles))改成下面的反转索引循环 for i in reversed(range(len(allfiles))): # 保留你原来的outfname生成逻辑 outfname = ... # 比如基于i或者allfiles[i]生成输出路径 if not exists(outfname): pool.apply_async(perc_normal, args=[allfiles[i], normfname, maskfname, outfname, fill, 0, indir])
这样i会从最后一个文件的索引开始,倒着遍历到第一个,提交任务的顺序就是从最新到最旧的文件。
方案二:直接反转文件列表(适合输出文件名依赖输入文件本身的场景)
如果你的输出文件名是直接从输入文件名派生的(比如替换后缀、修改前缀),可以先反转allfiles列表,再遍历反转后的列表:
# 先反转文件列表,得到从最新到最旧的顺序 reversed_files = list(reversed(allfiles)) for file in reversed_files: # 根据当前file生成对应的输出文件名 outfname = ... # 比如 os.path.join(outdir, os.path.basename(file).replace("input", "output")) if not exists(outfname): pool.apply_async(perc_normal, args=[file, normfname, maskfname, outfname, fill, 0, indir])
注意事项
多进程的实际执行顺序可能会因为系统调度、进程池大小等因素略有差异,但任务会按照你提交的顺序(最新到最旧)进入任务队列,系统会优先处理队列前面的任务,基本能满足你从最新到最旧处理的需求。
内容的提问来源于stack exchange,提问作者merkator509
相关产品推荐
相关产品推荐

