Python多线程中如何跨类访问其他类动态变化的实例变量
问题场景
需要实现的效果:类A持续修改自身实例变量self.tt时,类B的check()方法可实时打印、读取、使用这个动态变化的self.tt值。
当前问题代码:
class A: def __init__(self): self.tt = 0 def change_tt(self): for i in range(100000000): self.tt += 1 sleep(1) class B(): def __init__(self): self.x = A.tt def check(self): while True: print(self.x) a = A() b = B() x1 = threading.Thread(target=A.change_tt) x2 = threading.Thread(target=B.check) x1.start() x2.start()
运行代码抛出错误:
AttributeError: type object 'A' has no attribute 'tt'
错误原因
tt是类A的实例属性,仅在A实例化后的对象上存在,直接通过类本身A.tt访问必然找不到属性,触发报错。- 线程启动时传入的target参数错误:
A.change_tt、B.check都是类层面的未绑定方法,没有绑定到创建的实例a、b上,就算解决属性访问问题,运行时也会因为缺少self参数抛出异常。 - 逻辑设计错误:就算正确拿到
tt的初始值赋值给self.x,整数是值类型,赋值操作是值拷贝,后续A实例修改tt不会影响B里存的初始值,无法实现动态读取的效果。
可行实现方案
最直接的实现方式是让B实例持有A实例的引用,每次读取值时直接访问A实例上的实时tt属性,同时修正线程的绑定方式,代码如下:
import threading from time import sleep class A: def __init__(self): self.tt = 0 def change_tt(self): for i in range(100000000): self.tt += 1 sleep(1) class B(): def __init__(self, a_instance): # 持有A实例的引用,而非拷贝tt的初始值 self.a_ref = a_instance def check(self): while True: # 每次访问直接读取A实例上的最新tt值 print(self.a_ref.tt) sleep(0.5) # 增加轮询间隔,避免占满CPU if __name__ == "__main__": a = A() # 将已实例化的A对象传入B b = B(a) # 线程绑定实例方法,设置为守护线程避免程序无法退出 x1 = threading.Thread(target=a.change_tt, daemon=True) x2 = threading.Thread(target=b.check, daemon=True) x1.start() x2.start() # 阻塞主线程维持子线程运行 while True: sleep(1)
优化建议
- 高并发场景下建议给
tt的读写加线程锁:可以在A类初始化时创建self.lock = threading.Lock(),修改tt时用with self.lock包裹,读取时按需加锁,避免多线程竞争导致的值异常。 - 轮询方式资源占用较高,如果对实时性要求高、业务逻辑复杂,可以改用观察者模式:A类维护一个订阅者列表,
tt值变化时主动推送最新值给所有订阅的B实例,不需要B一直循环查询。 - 轮询间隔需要根据业务场景合理设置,不要无休眠死循环打印/读取,否则会占满单个CPU核心,造成不必要的资源浪费。
内容的提问来源于stack exchange,提问作者tung
相关产品推荐
相关产品推荐

