如何为pysnmp的SNMP v1/v2请求设置超时与重试次数?
解决pysnmp异步请求无限运行的问题
针对无效请求导致程序无限运行的问题,有两个可靠的解决思路:
1. 用asyncio.wait_for给SNMP请求加全局超时
这是最直接的方式,强制限制整个SNMP请求的总运行时间,不管内部逻辑如何,超时后直接终止任务。
修改你的代码如下:
import asyncio from pysnmp.hlapi.v1arch.asyncio import * async def run(): snmpDispatcher = SnmpDispatcher() try: # 用wait_for包裹getCmd,设置总超时时间(示例为3秒,可按需调整) iterator = await asyncio.wait_for( getCmd( snmpDispatcher, CommunityData("public", mpModel=0), await UdpTransportTarget.create(("1.2.3.4", 161), timeout=1, retries=0), ("1.3.6.1.2.1.1.1.0", None), ), timeout=3 ) errorIndication, errorStatus, errorIndex, varBinds = iterator if errorIndication: print(errorIndication) elif errorStatus: print( "{} at {}".format( errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or "?", ) ) else: for varBind in varBinds: print(" = ".join([x.prettyPrint() for x in varBind])) except asyncio.TimeoutError: print("SNMP请求超时") finally: snmpDispatcher.transportDispatcher.closeDispatcher() asyncio.run(run())
2. 确认UdpTransportTarget参数的生效逻辑
你已经设置了timeout=1(单次请求超时时间,单位秒)和retries=0(不重试),但如果目标完全无法连接,pysnmp底层可能不会立即触发超时。此时结合全局超时可以彻底解决问题。
如果需要更精细的底层IO控制,也可以调整SnmpDispatcher的配置,但asyncio.wait_for是最通用、易实现的方案。
内容的提问来源于stack exchange,提问作者Doldrums
相关产品推荐
相关产品推荐

