Python使用multiprocessing时类实例成员变量未更新问题求助
问题根因
- Python
multiprocessing模块创建的子进程拥有独立的内存空间,你传入子进程执行的类实例会被完整复制到子进程内存中。 - 子进程内所有对
self._duration的更新,都仅作用于子进程持有的实例副本,主进程中的原始vt实例完全没有被修改,因此最终调用GetDuration()只会返回初始值0。
修复方案
方案1:使用共享变量实现跨进程数据同步
使用multiprocessing提供的共享变量类型Value存储时长,主、子进程操作的是同一块内存区域的变量,修改可以同步到双方:
import multiprocessing import time class Tracker : def __init__(self): # 'i'表示存储的是int类型,初始值为0 self._duration = multiprocessing.Value('i', 0) def UpdateDuration(self): # 加锁避免多进程操作的竞态问题 with self._duration.get_lock(): self._duration.value += 1 print ("updated the duration to : {0}".format(self._duration.value)) def GetDuration(self): return self._duration.value def ThreadRunner(self) : while True : self.UpdateDuration() time.sleep(1)
主进程逻辑不需要修改,直接运行即可拿到正确的时长。
方案2:改用线程实现(适合仅做定时计数的轻量场景)
如果你当前的逻辑没有CPU密集型计算需求,只是做简单的计时,改用线程实现成本更低,线程共享同一进程的内存空间,对实例变量的修改会直接作用在原始实例上:
# 主进程逻辑修改如下,类定义可以完全复用你原来的代码 import threading trip = False end = False while not trip : start = input("do you want to start the trip? : ") if start.lower() == "start" : trip = True if trip : vt = Tracker() # 改用线程启动,daemon=True设置守护线程随主进程自动退出 t1 = threading.Thread(target = vt.ThreadRunner, args=(), daemon=True) t1.start() inp = input("Enter any char if you want to end the trip : ") print ("Trip duration : {0}".format(vt.GetDuration()))
内容的提问来源于stack exchange,提问作者s_om
相关产品推荐
相关产品推荐

