You need to enable JavaScript to run this app. Python使用multiprocessing时类实例成员变量未更新问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 14:36:04