使用Multiprocessing starmap出现重复对象问题求助
问题原因与解决方法
核心问题
你的代码中np.repeat(inst, len(unique_vals))并没有生成多个独立的EgClass实例,只是重复了对同一个实例的引用。结合multiprocessing进程池的复用机制:
- 当任务数超过进程数时,进程会被重复利用
- 同一个进程内的所有任务,都会共享该进程从父进程拷贝来的那个
EgClass实例 - 后续任务修改实例时,会覆盖之前任务对该实例的修改,最终导致返回结果出现重复或缺失
修复代码
将输入列表改为为每个任务创建独立的EgClass实例:
import numpy as np from multiprocessing import Pool class EgClass: pass def fun(eg_class, val): eg_class.val = val return eg_class if __name__ == "__main__": unique_vals = list(np.arange(12)) # 为每个任务生成独立的类实例 inputs = [(EgClass(), val) for val in unique_vals] p = Pool(processes=2) results = p.starmap(fun, inputs) p.close() result_vals = [i.val for i in results] print(result_vals) print(unique_vals)
为什么少量任务时正常?
当任务数量≤进程数时,每个进程仅处理一个任务,每个任务拿到的实例拷贝不会被复用,因此不会出现覆盖问题。只有当任务数超过进程数,触发进程复用时,才会出现实例被重复修改的情况。
内容的提问来源于stack exchange,提问作者Alex Witsil
相关产品推荐
相关产品推荐

