使用ProcessPoolExecutor后资源追踪器关闭方法及集群任务子进程残留问题求助
使用ProcessPoolExecutor后资源追踪器关闭方法及集群任务子进程残留问题求助
各位好,我最近在集群批处理队列里用concurrent.futures.ProcessPoolExecutor的时候碰到个头疼的问题——任务明明执行完了,但提交的作业没法正常关闭,查了下发现是ProcessPoolExecutor创建的子进程在池本身关闭后还在后台跑着。
我知道大家都需要最小复现示例,所以特意准备了这段代码:
import time from concurrent.futures import ProcessPoolExecutor, as_completed def test_function(i): time.sleep(20) return i def test_pool(): with ProcessPoolExecutor(max_workers=6) as executor: futures = [] result = [] for i in range(6): futures.append(executor.submit(test_function, i)) for future in as_completed(futures): result.append(future.result()) print(len(result)) if __name__ == '__main__': test_pool()
本地运行这段代码的时候看起来一切正常,with块结束后池也能正常关闭,子进程都会退出。但一放到集群的批处理队列里,情况就不对了:并行任务明明已经成功完成,可总有一个由ProcessPoolExecutor创建的子进程还在活跃着,导致整个作业没法被系统正确标记为完成状态。
我本来以为ProcessPoolExecutor的上下文管理器会自动处理所有子进程的清理工作,但显然在集群环境下这个机制好像没起作用。有没有朋友遇到过类似的问题?是不是集群的进程管理逻辑和本地不一样?有没有什么可靠的方法能确保所有子进程都被彻底终止,让作业能正常结束?
备注:内容来源于stack exchange,提问作者Ray Osborn
相关产品推荐
相关产品推荐

