Netmiko结合线程队列处理多设备时队列超线程数脚本无限运行求助
问题根因定位
你脚本卡住的核心原因是queue.Queue的task_done()调用位置完全不符合预期:
q.get()每取出一个任务,处理完成后必须调用一次q.task_done(),用来通知队列该任务执行完毕- 你的代码中仅在判断
q.empty()队列空的时候才调用一次q.task_done(),绝大多数已处理完成的任务都没有标记完成,导致q.join()永远等不到所有任务完成的通知,所以卡住。
以你提到的6台设备5线程的场景验证:队列总计有6个任务,需要累计调用6次task_done()才会触发q.join()结束。但你的代码只会在最后一个任务处理完成、队列变空的时候调用1次task_done(),剩余5次调用完全缺失,所以q.join()永远阻塞,不会执行后续的打印。
修复代码
只需要调整check_csg_state函数里task_done()的调用位置即可:
def check_csg_state(q): global nbr while True: try: # 加1秒超时,避免队列空时线程一直阻塞等待新任务 csg_host = q.get(timeout=1) except queue.Empty: print(currentThread().getName()," : terminated") return thread_name = currentThread().getName() error, csg_vendor = csg_connect(csg_host) if error == "none": with PRINT_LOCK: print(str(nbr)+"-"+csg_host+":"+csg_vendor+" OK :",currentThread().getName()) nbr+=1 else: with PRINT_LOCK: print(str(nbr)+"-"+csg_host + ":" + csg_vendor + " NOK :",currentThread().getName()) nbr+=1 # 每处理完一个任务就标记一次完成 q.task_done()
可选优化建议
- 你当前
csg_connect里用counter == 100000000判断超时准确度极低,且循环内没有休眠会占满CPU核心,建议改成按实际时间判断超时,每次循环加time.sleep(0.1)减少资源占用 - 全局变量
nbr计数可以换成线程安全的计数器实现,避免多线程读写风险
内容的提问来源于stack exchange,提问作者imad91
相关产品推荐
相关产品推荐

