Python多进程如何在目标函数执行结束后自动终止对应进程
问题1解答
mp.Process 启动的子进程默认就会在执行完my_target函数的最后一行代码后自动终止,不需要额外添加终止逻辑。
需要注意的是,子进程终止后会暂时成为僵尸进程,仅占用操作系统进程表的极小条目,你只需要在所有进程启动后添加如下代码回收资源即可:
for p in processes: p.join()
问题2解答
不会。已经执行完成的终止/闲置进程不会占用CPU算力、内存等核心运行资源,仅有的进程表条目开销可以忽略不计,完全不会拖慢仍在运行的工作进程的执行效率。只有当你启动了远超过CPU核心数的进程、大量进程同时处于运行状态争抢CPU资源时,才会出现效率下降的问题。
问题3解答
你当前的写法存在逻辑问题:你在创建进程的列表推导式中,给所有进程传入了相同的input_file和output_file参数,会导致所有进程都处理同一个文件,不符合你拆分多个子文件并行处理的需求。
针对你的场景更推荐使用multiprocessing.Pool进程池实现,不需要手动管理进程的启动、回收逻辑,内置的任务调度逻辑会自动把不同子文件的处理任务分配给空闲的工作进程,代码示例如下:
import multiprocessing as mp def my_target(args): input_file, output_file = args # 原有处理逻辑 ... if __name__ == "__main__": # 提前生成所有拆分后的<输入文件,输出文件>路径对列表 file_pairs = [ ("sub_input_1.json", "sub_output_1.json"), ("sub_input_2.json", "sub_output_2.json"), # 剩下的所有拆分文件对 ... ] worker_count = mp.cpu_count() # 初始化对应核数的进程池 with mp.Pool(worker_count) as pool: # 自动分配任务到空闲进程执行 pool.map(my_target, file_pairs)
这个方案会自动处理进程的生命周期,任务完成后自动回收进程资源,也不需要你手动给每个进程分配对应文件,实现更简洁,出错概率更低。
内容的提问来源于stack exchange,提问作者Odess4
相关产品推荐
相关产品推荐

