Python使用BoundedSemaphore限制线程数时传参触发TypeError问题
错误根源&修正方案
你遇到的参数报错核心是自定义线程子类没有适配多参数传入逻辑,同时存在多处线程实例化、类方法定义的语法错误,具体修正逻辑如下:
- 自定义的
MyThread类继承自threading.Thread,没有重写__init__方法接收自定义参数,Thread原生的__init__最多只支持6个内置参数,直接传17个自定义参数肯定会触发参数数量不匹配的报错。 - 类的普通实例方法第一个参数必须是
self,用于指向实例本身,你的run_compare方法缺少self参数,调用时会出现参数错位。 - 你已经自定义了Thread子类,直接实例化
MyThread即可,不需要再套一层threading.Thread,原代码里target参数的用法完全错误。 join方法的缩进错误,放在创建线程的循环内会导致线程串行执行,完全失去多线程意义,要放到循环外。run是Thread类的固定执行入口,不能随意增加参数,需要的参数直接从实例属性中读取即可。
修正后的完整代码
import os import sys import threading threadLimiter = threading.BoundedSemaphore(10) class MyThread(threading.Thread): # 重写__init__接收自定义参数,**kwargs可以兼容你17个参数的场景,不用一个个写参数名 def __init__(self, run, main_path, target_path, jiranum, *args, **kwargs): super().__init__(*args, **kwargs) # 把参数存为实例属性 self.run = run self.main_path = main_path self.target_path = target_path self.jiranum = jiranum def run(self): threadLimiter.acquire() try: # 直接调用实例方法,参数从实例属性取 self.run_compare() finally: threadLimiter.release() def run_compare(self): os.chdir(self.target_path) # 注意os.system的参数拼接逻辑根据你的实际需求调整,这里仅保留你原来的写法 os.system(f"{self.main_path}, {self.target_path},{self.jiranum},{self.run}") if __name__ == '__main__': # 这里需要先定义好run总次数、main_path、target_path、jiranum这几个全局变量,再执行后续逻辑 threads = [] # 先把所有线程创建完 for i in range(1, int(run)+1): # 直接实例化自定义的MyThread,传入所有参数 process = MyThread(str(i), main_path, target_path, jiranum) process.start() threads.append(process) # 所有线程创建完再统一join for process in threads: process.join()
如果你有更多参数,直接在__init__里增加参数接收即可,或者直接用**kwargs接收所有键值对参数,不需要修改类的其他逻辑。
内容的提问来源于stack exchange,提问作者personalt
相关产品推荐
相关产品推荐

