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

如何在Python类中并行设置实例属性?

解决方案:多进程下更新类实例属性的正确方式

你的问题核心在于多进程的内存隔离机制:multiprocessing.Pool会将类实例复制到每个子进程中,子进程修改的只是副本的属性,主进程的原始实例完全不受影响。以下是两种推荐的实现方式,支持字典、Pandas DataFrame等任意类型的属性更新:

方式一:使用multiprocessing.Manager创建共享对象

Manager会启动一个独立的服务进程,托管可共享的对象(字典、命名空间等),所有子进程通过代理访问这些对象,修改操作会同步到主进程。这是处理复杂类型(如DataFrame)最便捷的方案。

代码示例(支持字典+DataFrame)

from multiprocessing import Pool, Manager
import random
import pandas as pd


class A():
    def __init__(self, n_jobs):
        # 1. 创建Manager托管的共享字典
        manager = Manager()
        self.d = manager.dict()
        
        # 2. 创建Manager命名空间托管DataFrame(支持任意复杂对象)
        self.ns = manager.Namespace()
        self.ns.df = pd.DataFrame(columns=['key', 'value'])
        
        self.n_jobs = n_jobs
        pool = Pool(self.n_jobs)
        
        # 并行更新字典
        pool.map(self.update_d, range(100))
        # 并行更新DataFrame(按需启用)
        # pool.map(self.update_df, range(100))
        
        pool.close()
        pool.join()  # 必须等待所有子进程完成,确保修改同步
    
    def update_d(self, key):
        # 直接修改共享字典,主进程会同步看到结果
        self.d[key] = random.randint(0, 100)
    
    def update_df(self, key):
        # 修改共享命名空间中的DataFrame(假设无进程冲突)
        new_row = pd.DataFrame({'key': [key], 'value': [random.randint(0, 100)]})
        self.ns.df = pd.concat([self.ns.df, new_row], ignore_index=True)


if __name__ == '__main__':
    a = A(n_jobs=4)
    # 共享字典转普通字典查看
    print(dict(a.d))
    # 查看更新后的DataFrame
    print(a.ns.df)

方式二:使用共享内存(适合简单类型)

如果是数值、字符串等简单类型,可以直接用multiprocessing.Value或Array创建共享内存变量,但对于DataFrame这类复杂对象,Manager的方案更易用。

关键注意事项

  • 必须调用pool.join():确保所有子进程完成修改后,主进程再访问属性,避免读取到未完成的状态。
  • 冲突处理(可选):如果后续存在进程冲突风险,可以用manager.Lock()加锁,确保同一时间只有一个进程修改共享对象。

内容的提问来源于stack exchange,提问作者Shaun Han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:10:36