Asyncio+pysnmp的SNMP脚本接收400条响应后停止处理
问题分析与解决思路
可能的诱因
- Windows asyncio Selector 限制:Python 3.8 在 Windows 上默认使用
SelectorEventLoop,它对同时监听的套接字数量有默认阈值(约512个)。你的轮询批次是100台,到第4批左右刚好接近这个上限,后续SNMP请求的套接字无法被正常监听,导致收到响应也无法处理。 - pysnmp 旧版本资源泄漏:你用的 pysnmp 4.4.12 是2020年的旧版本,异步模式下存在套接字未及时关闭的bug,随着批次增加,占用的文件句柄/套接字资源越积越多,触达系统限制后无法处理新响应。
- 批次处理逻辑漏洞:如果脚本处理完一批后,没正确清理异步任务、关闭SNMP会话,导致任务队列堆积或资源占用无法释放,后续响应的回调就无法被执行。
可行的解决办法
- 切换到 ProactorEventLoop:Python 3.8+ 支持Windows专用的
ProactorEventLoop,能突破Selector的套接字数量限制,在脚本开头添加:import asyncio asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) - 升级 pysnmp 版本:旧版本的资源泄漏问题在后续版本已修复,执行命令升级到最新稳定版:
pip install --upgrade pysnmp - 强化批次资源清理:每批任务完成后,主动调用pysnmp会话或传输对象的关闭方法,用上下文管理器管理会话生命周期,确保资源及时释放。
- 临时调整批次大小:把每批设备数从100降到50,验证是否能处理更多设备,确认是否是资源限制导致的问题。
验证方式
- 修改事件循环后重新运行脚本,观察是否能处理所有设备的响应。
- 用Windows资源监视器查看Python进程的句柄数量,看是否在处理到400台左右时达到峰值。
内容的提问来源于stack exchange,提问作者bl4met
相关产品推荐
相关产品推荐

