Python中如何处理多进程程序运行结束后生成的结果文件?
问题解答
先修正原代码的两个问题
- 语法错误:你写的文件名字符串格式化规则不对,
"test_%idx.txt"%idx会触发格式解析错误,应该改为"test_%d.txt"%idx或者更易读的f-string写法f"test_{idx}.txt"。 - 逻辑错误:
subprocess.Popen不支持直接传入Python函数作为执行目标,它是用于启动系统级独立外部进程的工具。如果你要在Python中启动子进程执行自定义函数,更合适的选择是multiprocessing模块,或者把目标逻辑封装成独立Python脚本后再用subprocess调用。
修正后的多进程执行参考代码如下:
import multiprocessing import os def f(idx): # 处理数据并生成文件 file_path = f"test_{idx}.txt" with open(file_path, "a") as fi: fi.write(str(idx)) # 场景1:子进程内处理自身生成的文件 # 生成完成后直接在这里处理即可,每个子进程只会操作自己产出的文件,不会和其他进程冲突 # 示例逻辑:打印文件大小 file_size = os.path.getsize(file_path) print(f"子进程{idx}处理完成,文件{file_path}大小为{file_size}字节") return file_path if __name__ == "__main__": process_list = [] for i in range(5): p = multiprocessing.Process(target=f, args=(i,)) process_list.append(p) p.start() # 等待所有子进程执行完毕,必须加这一步才能保证主进程处理时所有文件都已经写完 for p in process_list: p.join() # 场景2:主进程统一处理所有子进程生成的文件 print("\n主进程开始批量处理文件:") for idx in range(5): target_file = f"test_{idx}.txt" if os.path.exists(target_file): # 这里写你需要的处理逻辑,比如读取内容、压缩、归档、入库等 with open(target_file, "r") as f: content = f.read() print(f"读取test_{idx}.txt,内容为:{content}")
两种处理场景的注意事项
- 子进程内处理:不需要额外做进程同步,适合不需要跨文件汇总数据的场景,处理完成后如果需要把结果传回主进程,可以用
multiprocessing.Queue或者Pipe传递数据。 - 主进程内处理:必须先调用
join()等待所有子进程完全退出后再操作文件,避免出现文件还没写完就被主进程读取的异常;如果生成的文件名不固定,可以让子进程把生成的文件路径通过队列传给主进程,不需要硬编码文件名做匹配。
必须使用subprocess的处理方案
如果你的业务场景要求必须用subprocess启动进程,可以把f函数的逻辑封装成独立的Python脚本,通过命令行参数传递idx值,生成文件后可以选择直接在脚本内处理,或者主进程调用所有subprocess的wait()方法确认进程退出后,再统一处理所有文件。
内容的提问来源于stack exchange,提问作者Ally Apple
相关产品推荐
相关产品推荐

