Python线程问题:含静态变量与信号量的多线程示例修改求助
问题分析与修复方案
错误原因
- 未正确访问类静态变量:
run方法里的a += 1会被Python判定为局部变量,但你没在方法内定义过a,所以抛出UnboundLocalError。要修改类的静态变量,必须明确指定是类属性(比如async_.a)或者通过实例的类型对象访问(type(self).a)。 - 锁的作用范围错误:你在每个线程实例的
__init__里创建了独立的Semaphore,这意味着每个线程拿的是自己的锁,根本无法同步多个线程对静态变量的修改,完全起不到临界区的作用。
修复后的代码
import threading class async_(threading.Thread): a = 0 # 把信号量设为类静态属性,让所有线程共享同一把锁 sem = threading.Semaphore() def __init__(self): super().__init__() def run(self): # 共享同一把锁,进入临界区 async_.sem.acquire() # 明确访问类的静态变量a async_.a += 1 print("Done") async_.sem.release() bg1 = async_() bg2 = async_() bg3 = async_() bg1.start() bg2.start() bg3.start() print('Background started') bg1.join() bg2.join() bg3.join() print(async_.a) print('Background joined')
额外说明
- 用
super().__init__()替代threading.Thread.__init__(self)是更符合Python规范的写法,尤其是在继承场景下。 - 如果要支持子类继承,用
type(self).a和type(self).sem来访问会更灵活,避免硬编码类名。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

