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
相关产品推荐
相关产品推荐

