socket服务器中使用threading.local报AttributeError:无token属性求助
解决AttributeError: '_thread._local' object has no attribute 'token'问题
问题根源很明确:你每次调用threading.local()都会生成一个全新的线程本地存储实例——哪怕在同一个线程里重复调用,得到的也是互不关联的独立对象。你先通过global_data = threading.local()创建实例并设置token属性,但日志打印时又重新调用threading.local(),这是另一个全新实例,自然找不到token属性。
两种可行的修复方案:
方案1:复用同一个局部变量
直接使用之前创建的global_data变量访问属性,不要重新调用threading.local():
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): token = str(uuid4()) global_data = threading.local() global_data.token = token logger.info(f"threading.local().token: {global_data.token}") # 复用已创建的实例
方案2:将threading.local实例定义为类属性
把threading.local()实例定义为请求处理器的类属性,每个线程会自动拥有该实例的独立数据副本,整个线程处理流程中都能复用:
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): global_data = threading.local() def handle(self): token = str(uuid4()) self.global_data.token = token logger.info(f"threading.local().token: {self.global_data.token}")
补充说明
线程本地存储(threading.local)的核心特性是:同一个实例在不同线程中拥有独立的属性存储空间,但同一个线程内,只有同一个实例才能访问到你设置的属性。重复调用threading.local()会生成多个无关联的实例,它们之间的数据完全隔离,哪怕在同一个线程里也无法共享属性。
内容的提问来源于stack exchange,提问作者J.Horcasitas
相关产品推荐
相关产品推荐

