You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python线程问题:含静态变量与信号量的多线程示例修改求助

问题分析与修复方案

错误原因

  1. 未正确访问类静态变量:run方法里的a += 1会被Python判定为局部变量,但你没在方法内定义过a,所以抛出UnboundLocalError。要修改类的静态变量,必须明确指定是类属性(比如async_.a)或者通过实例的类型对象访问(type(self).a)。
  2. 锁的作用范围错误:你在每个线程实例的__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:03:17