You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:05:28