Python多进程计算文件大小求助:使用Pool后size始终为0
问题解决:多进程并行计算文件大小后size始终为0
问题原因
multiprocessing的子进程会复制父进程中的对象,你在子进程里调用calculate_size()修改的是对象副本的size属性,父进程中的原对象完全不受影响,所以最后所有实例的size还是初始值0。
解决步骤
- 先修正
F类的语法错误:calculate_size方法缺少self参数,否则根本无法调用。 - 不要直接在子进程中修改实例属性,改为通过独立函数计算文件大小并返回(路径+大小),再在父进程中将结果赋值给对应实例。
完整代码示例
import multiprocessing class F: def __init__(self, path): self.path = path self.size = 0 # 修正后的实例方法(也可以不用这个方法,直接用下面的独立函数) def calculate_size(self): with open(self.path, "rb") as f: self.size = len(f.read()) # 独立的计算函数,接收文件路径,返回路径和对应大小 def compute_file_size(path): with open(path, "rb") as f: return path, len(f.read()) if __name__ == "__main__": # 假设fails是F类实例的列表 fails = [F("file1.txt"), F("file2.txt"), F("file3.txt")] # 使用Pool并行计算 with multiprocessing.Pool() as pool: # 提取所有文件路径,传入计算函数 results = pool.map(compute_file_size, [fail.path for fail in fails]) # 将计算结果赋值给对应的F实例 # 用路径映射实例,避免嵌套循环提升效率 file_map = {fail.path: fail for fail in fails} for path, size in results: file_map[path].size = size # 验证结果 for fail in fails: print(f"文件 {fail.path} 的大小: {fail.size} 字节")
内容的提问来源于stack exchange,提问作者Анастасия Белоусова
相关产品推荐
相关产品推荐

