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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:33:15