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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:06:06