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

Python多线程同时运行报错AttributeError,求问题原因及解决办法

问题分析与修正

错误原因

  1. Main函数返回None导致属性访问失败
    你的Main()函数没有任何return语句,执行后默认返回None。当你写Main().firstfunc时,相当于在尝试访问None的firstfunc属性,自然触发AttributeError。另外,firstfunc和secondfunc是Main内部的局部函数,原本就无法从Main外部直接访问,除非Main主动返回它们。

  2. 线程对象创建与启动方式错误
    你写的Thread(target=...).start是把线程对象的start方法本身赋值给了T1、T2,而不是创建线程实例并启动它。正确的做法是先创建Thread实例,再调用实例的start()方法,这样实例本身才能调用join()方法。

  3. 变量名冲突(隐性问题)
    你用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:40:41