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

在类中使用multiprocessing并传入self参数,为何运行后值不同?

多进程中类实例变量不共享导致输出差异的原因

首先展示你的代码:

from multiprocessing import Process

class A:
    def __init__(self):
        self.a = 10

    def main_loop(self):
        while True:
            self.a -= 2
            print(self.a)

    def player_status(self):
        while True:
            self.a -= 5
            print(self.a)
    
    def run(self):
        if __name__ == '__main__':
            Process(target=self.main_loop).start()
            Process(target=self.player_status).start()


a1 = A()
a1.run()

核心原因:多进程的内存隔离机制

Python的multiprocessing模块创建子进程时,会完整复制父进程的内存空间,包括类实例a1的所有数据。这意味着:

  • main_loop和player_status分别运行在两个完全独立的进程中,各自拥有一份self.a的副本,初始值都是10。
  • 两个进程对self.a的修改仅在自身内存空间生效,不会同步到对方的副本,也不会影响父进程中的原变量。
  • 所以你会看到main_loop输出的是10-2-2-...的递减结果,player_status输出的是10-5-5-...的递减结果,二者自然不同。

额外代码隐患修正

你把if __name__ == '__main__':放在了类的run方法里,这在Windows系统下会触发问题——Windows启动子进程时会重新导入整个模块,导致a1 = A(); a1.run()被重复执行,进而创建大量冗余子进程,最终引发错误。正确的写法是把这个判断放在模块最外层:

from multiprocessing import Process

class A:
    def __init__(self):
        self.a = 10

    def main_loop(self):
        while True:
            self.a -= 2
            print(self.a)

    def player_status(self):
        while True:
            self.a -= 5
            print(self.a)
    
    def run(self):
        Process(target=self.main_loop).start()
        Process(target=self.player_status).start()


if __name__ == '__main__':
    a1 = A()
    a1.run()

共享变量的解决方案

如果需要让两个进程操作同一个变量,可以使用multiprocessing提供的共享内存对象,比如Value或Manager,同时要加锁避免并发竞争:

from multiprocessing import Process, Value

class A:
    def __init__(self):
        # 创建共享整数,初始值为10
        self.a = Value('i', 10)

    def main_loop(self):
        while True:
            # 加锁确保修改操作的原子性
            with self.a.get_lock():
                self.a.value -= 2
                print(self.a.value)

    def player_status(self):
        while True:
            with self.a.get_lock():
                self.a.value -= 5
                print(self.a.value)
    
    def run(self):
        Process(target=self.main_loop).start()
        Process(target=self.player_status).start()


if __name__ == '__main__':
    a1 = A()
    a1.run()

这样两个进程操作的是同一个共享变量,修改会互相影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:35