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

ThreadPoolExecutor未并行执行无线控制器TFTP固件传输任务排查

问题根源分析

你的代码未实现并行的核心原因是错误地直接执行了目标函数,而非将可调用对象与参数传递给submit方法。

具体问题点

在这行代码中:

executor.submit(aos_ArubaAPI_utils.tftp_firmware_to_controller(mc, firmware, part, uid), mc)

你直接调用了aos_ArubaAPI_utils.tftp_firmware_to_controller(...),这会导致当前主线程立即执行该函数,等它完成(单台10分钟)后,才把函数的返回值(而非函数本身)传给submit。线程池根本没机会接管任务,自然只能串行执行。

修正方法

submit的正确用法是:第一个参数传入可调用的函数对象,后续依次传入该函数需要的参数。修改后的代码如下:

with concurrent.futures.ThreadPoolExecutor(max_workers=len(mc_list)) as executor:
    # 遍历控制器列表
    for mc in mc_list:
        # 获取当前控制器的uid
        uid = aos_ArubaAPI_utils.get_uid(host=mc, user=user, pword=pwd)
        print(f"Attempting to call function using executor")

        # 正确传递可调用对象与参数
        executor.submit(aos_ArubaAPI_utils.tftp_firmware_to_controller, mc, firmware, part, uid)

额外优化建议

如果get_uid操作也涉及网络请求、存在耗时,可将这一步也纳入线程池并行处理,进一步提升整体效率:

def process_single_mc(mc, user, pwd, firmware, part):
    uid = aos_ArubaAPI_utils.get_uid(host=mc, user=user, pword=pwd)
    print(f"Starting firmware transfer for {mc}")
    aos_ArubaAPI_utils.tftp_firmware_to_controller(mc, firmware, part, uid)

with concurrent.futures.ThreadPoolExecutor(max_workers=len(mc_list)) as executor:
    # 批量提交所有控制器的处理任务
    executor.map(process_single_mc, mc_list, [user]*len(mc_list), [pwd]*len(mc_list), [firmware]*len(mc_list), [part]*len(mc_list))

内容的提问来源于stack exchange,提问作者Guy Goodrick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:25:59