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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:27:05