Python多线程同时运行报错AttributeError,求问题原因及解决办法
问题分析与修正
错误原因
Main函数返回None导致属性访问失败
你的Main()函数没有任何return语句,执行后默认返回None。当你写Main().firstfunc时,相当于在尝试访问None的firstfunc属性,自然触发AttributeError。另外,firstfunc和secondfunc是Main内部的局部函数,原本就无法从Main外部直接访问,除非Main主动返回它们。线程对象创建与启动方式错误
你写的Thread(target=...).start是把线程对象的start方法本身赋值给了T1、T2,而不是创建线程实例并启动它。正确的做法是先创建Thread实例,再调用实例的start()方法,这样实例本身才能调用join()方法。变量名冲突(隐性问题)
你用了max作为变量名,这是Python的内置函数名,会覆盖内置函数,可能引发后续隐性错误,建议改成max_val这类名称。
修正方案
方案一:移除不必要的嵌套函数(推荐)
把内部函数提取为全局函数,直接传递参数:
from threading import Thread def firstfunc(max_val): for i in range(0, max_val): print(i) def secondfunc(max_val): for i in range(0, max_val): print(i+10) if __name__ == '__main__': n = 10 k = 2 max_val = n // k # 创建线程实例 T1 = Thread(target=firstfunc, args=(max_val,)) T2 = Thread(target=secondfunc, args=(max_val,)) # 启动线程 T1.start() T2.start() # 等待线程结束 for thread in [T1, T2]: thread.join()
方案二:保留嵌套函数,让Main返回内部函数
如果一定要保留嵌套结构,可以让Main返回两个内部函数:
from threading import Thread def Main(): n = 10 k = 2 max_val = n // k def firstfunc(): for i in range(0, max_val): print(i) def secondfunc(): for i in range(0, max_val): print(i+10) # 返回两个内部函数 return firstfunc, secondfunc if __name__ == '__main__': func1, func2 = Main() T1 = Thread(target=func1, args=()) T2 = Thread(target=func2, args=()) T1.start() T2.start() for thread in [T1, T2]: thread.join()
内容的提问来源于stack exchange,提问作者Edoardo Balducci
相关产品推荐
相关产品推荐

