在类中使用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
相关产品推荐
相关产品推荐

