Python类中While循环内类变量未更新问题求助(同一类中另一个线程的函数正在修改该变量)
问题排查与修复方案
嘿,我来帮你搞定这个多线程变量更新的问题!你的代码里有两个关键问题导致变量没法正常更新、传递,咱们一步步拆解:
首先,最直接的初始化错误
你的TestClass的__init__方法里完全没初始化self.players变量!这会导致loop线程第一次执行print(self.players)的时候直接抛出AttributeError,程序直接崩掉,根本走不到后续的更新逻辑。
其次,线程共享变量的可见性问题
就算你初始化了变量,Python多线程里对整数这种不可变类型的读写,可能会因为CPU缓存的优化,出现一个线程改了值,另一个线程看不到最新结果的情况——这就是所谓的内存可见性问题,看起来就像是变量没更新一样。
修复后的完整代码
import random import threading class TestClass: def __init__(self): # 先给共享变量一个初始值,避免首次访问报错 self.players = 0 # 加一把锁,保证读写操作的原子性和内存可见性 self.lock = threading.Lock() def loop(self): while True: # 读取变量时加锁,确保拿到的是最新值 with self.lock: print(self.players) def loop2(self): while True: new_num = random.randint(1, 100) # 更新变量时也加锁,避免读写冲突 with self.lock: self.players = new_num if __name__ == '__main__': a = TestClass() t = threading.Thread(target=a.loop2) t.start() a.loop()
关键修改说明
- 初始化变量:在
__init__里给self.players设初始值,解决首次访问的属性错误。 - 使用线程锁:通过
threading.Lock配合with语句,把对self.players的读写操作变成原子性的,同时强制线程之间同步内存,确保一个线程修改的值能立刻被另一个线程看到。
如果觉得锁的开销有点大,也可以试试threading.Event或者用ctypes的原子类型,但对于这种简单的场景,锁是最直观、最容易维护的方案。
内容的提问来源于stack exchange,提问作者Jaan Kannel
相关产品推荐
相关产品推荐

