Python初始化线程时如何向类传参?附NameError报错排查
报错根因
当前触发NameError: name 'iterr' is not defined的直接原因,是你定义App类时在继承位写了不存在的标识符iterr:Python中class 类名(父类):的语法是声明类的继承关系,不存在名为iterr的内置类或你提前定义的类,自然会报未定义错误。
除此之外你的代码还有3处会导致后续运行异常的隐藏问题:
App类的__init__方法仅定义了self参数,但你在线程启动时给类传了位置参数i,修复第一个报错后会立刻触发参数数量不匹配的类型错误。- 控制线程数量的
while循环中没有对计数变量i做自增操作,代码会陷入死循环,无限创建i=1的线程。 - 读取
config/url.txt时循环逐行给table_url赋值,最终只会拿到文件最后一行的内容,如果你文件中仅存储1个目标表格URL不影响运行,但如果是多表格逻辑会出现数据遗漏。
修正后代码
import threading import gspread # 无特殊继承需求直接去掉括号内不存在的iterr,__init__补充接收行号参数 class App: def __init__(self, row_num): # 此处编写单条数据对应的业务处理逻辑,row_num为传入的行序号 print(f"开始处理第{row_num}行数据") if __name__ == '__main__': # 用with上下文管理读取文件,自动释放文件资源 with open('config/url.txt', encoding='utf-8') as table_file: # 直接读取文件全量内容、去除首尾空白符作为表格URL table_url = table_file.read().strip() gc = gspread.service_account(filename='config/auth.json') sh = gc.open_by_url(table_url) worksheet = sh.get_worksheet(0) values_list = worksheet.col_values(1) thread_total = len(values_list) i = 1 while i < thread_total + 1: thread = threading.Thread(target=App, args=(i,)) thread.start() # 计数自增,避免死循环 i += 1
补充说明
- 如果你的需求是实例化
App后执行类中的某个业务方法,而不是仅完成实例化,需要把线程的target参数替换为对应的实例方法,否则线程启动后只会走完__init__流程就直接退出,不会执行后续业务逻辑。 - 如果需要等待所有线程执行完毕再结束主线程,可以把每次创建的线程对象存入列表,所有线程启动完成后循环调用每个线程对象的
join()方法即可。
内容的提问来源于stack exchange,提问作者NIKITA
相关产品推荐
相关产品推荐

