如何在joblib多进程任务完成时立即获取并处理结果?
解决方案
你可以通过以下两种方式实现任务完成一个就即时处理结果:
方法一:使用callback回调函数
给Parallel添加callback参数,指定每个任务完成后要执行的处理函数。该函数会在主进程中被调用,接收单个任务的结果作为参数:
def handle_single_result(result): # 这里编写你的即时处理逻辑 print(f"已完成任务,结果:{result}") # 例如:保存到数据库、更新统计指标、生成中间文件等 # 执行并行任务,同时触发回调处理 resultTuples = Parallel(n_jobs=-1, prefer="processes", callback=handle_single_result)( delayed(RunSingleTask)(*p) for p in run_params )
这种方式会同时收集所有结果到resultTuples,适合需要保留全部最终结果,同时要即时处理单个结果的场景。
方法二:使用生成器模式
通过return_as="generator"参数让Parallel返回一个生成器,迭代生成器时会逐个获取已完成的任务结果,无需等待所有任务结束:
# 获取结果生成器 results_generator = Parallel(n_jobs=-1, prefer="processes", return_as="generator")( delayed(RunSingleTask)(*p) for p in run_params ) # 逐个处理完成的任务结果 for result in results_generator: # 编写即时处理逻辑 print(f"已完成任务,结果:{result}") # 例如:直接处理后丢弃,减少内存占用
这种方式不会预先缓存所有结果,内存占用更低,适合不需要保留全部结果的场景。
两种方案都基于joblib的多进程并行,完全适配你的CPU绑定任务需求,无需引入异步IO框架。
内容的提问来源于stack exchange,提问作者shda
相关产品推荐
相关产品推荐

