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

Python多进程下类实例属性修改互不干扰的原因咨询

为什么多进程修改类实例属性不会互相影响?

这问题问得太关键了,刚好抓住了多进程模型最核心的特性——进程间的内存隔离!我来给你掰扯清楚:

核心原因:每个子进程都有独立的内存副本

当你用mp.Pool创建子进程的时候,操作系统会给每个子进程分配完全独立的内存空间。主进程里的foo = Foo(1)这个实例,会被复制一份到每个子进程的内存里——相当于每个子进程手里都拿着一个和主进程一模一样,但完全分开的foo副本,它们之间根本碰不到对方的那个实例。

放到你的代码里具体说:

  • 主进程初始化的foo只在主进程的内存里;
  • 当Pool启动2个worker进程时,这两个进程各自复制一份foo到自己的内存;
  • 每个子进程调用foo.Sum(b)时,修改的都是自己副本里的self.a,和另一个子进程的foo半毛钱关系都没有;
  • 最后每个子进程把自己计算的结果返回给主进程,主进程收集起来,就出现了你看到的各个结果里self.a互不干扰的情况。

对比多线程(帮你加深理解)

如果换成多线程(比如用threading模块),所有线程共享同一内存空间,那多个线程同时修改同一个foo的self.a就会出现竞态条件——你可能会看到混乱的结果,因为线程A刚把self.a改成8,线程B可能立刻又把它改成4,结果就乱了。但多进程完全不会有这个问题,因为它们各玩各的。

额外补充:如果想让多进程共享属性怎么办?

如果你的业务场景真的需要多个进程共享同一个实例的属性,那得用multiprocessing提供的共享对象,比如:

  • mp.Value/mp.Array:用于共享基本数据类型;
  • mp.Manager:可以创建共享的字典、列表甚至自定义对象。
    不过这些是进阶用法,你现在刚学类和多进程,先把内存隔离这个核心概念吃透就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:32:47