使用concurrent.futures的ProcessPoolExecutor并行时末尾任务卡顿求助
ProcessPoolExecutor 最后任务停滞的排查与解决
可能的原因及对应解决思路
未等待任务完成,资源未正确回收
你当前代码仅提交任务,未显式等待任务结束。虽然ProcessPoolExecutor的with块会在退出时等待所有任务完成,但如果任务存在资源泄漏或死锁,可能导致最后几个任务卡住。建议用exe.map()替代submit(),它会自动等待所有任务完成,且返回结果顺序与输入一致,便于排查异常任务:import iris from concurrent.futures import ProcessPoolExecutor if interpolate_bool: with ProcessPoolExecutor(4) as exe: # 用map替代submit,自动等待任务完成并返回结果 list(exe.map(lambda x: interpolateCubes(x), cube_dict.items()))任务负载不均衡
最后两个任务对应的数据量可能远大于前面的任务,导致耗时剧增。可以检查cube_dict中最后几个元素的大小,确认是否因数据量差异导致。如果是,考虑拆分大任务或调整任务分配策略。interpolateCubes函数存在资源泄漏或死锁
比如函数中打开文件未关闭、使用iris库时存在进程间资源竞争等。可以单独运行最后两个任务对应的函数调用,排查是否是函数内部问题:# 单独测试最后两个任务,定位是否函数本身异常 last_two_items = list(cube_dict.items())[-2:] for item in last_two_items: interpolateCubes(item)如果单独运行也卡住,说明函数本身存在问题,比如iris加载数据时内存占用过高、插值逻辑有死循环等。
进程间通信开销过大
若cube_dict.items()包含大量数据,传递给子进程时会增加IPC开销。建议只传递必要参数(如文件路径而非已加载的数据集),减少进程间数据传输量。系统资源耗尽
前58个任务运行时占用了大量内存或CPU,导致最后两个任务无法获取足够资源。可以监控系统内存、CPU使用率,查看任务运行后期是否出现资源耗尽情况。如果是,可降低进程池大小(比如从4改为2),避免资源竞争。
内容的提问来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

