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
相关产品推荐
相关产品推荐

