pysnmp 常用操作

常用操作
在本教程中,我們將逐步構(gòu)建并運(yùn)行一些不同的SNMP命令請(qǐng)求和通知。我們將使用 最簡單的PySNMP同步高級(jí)API。

創(chuàng)建SNMP引擎

SNMP引擎是PySNMP中的一個(gè)核心傘形對(duì)象。所有PySNMP操作都涉及SnmpEngine類實(shí)例。PySNMP應(yīng)用程序可以運(yùn)行多個(gè)獨(dú)立的SNMP引擎,每個(gè)引擎都由自己的SnmpEngine對(duì)象引導(dǎo)。

>>> from pysnmp.hlapi import *
>>>
>>> SnmpEngine()
SnmpEngine(snmpEngineID=OctetString(hexValue='80004fb80567'))
SNMP引擎具有可以自動(dòng)或管理分配的唯一標(biāo)識(shí)符。此標(biāo)識(shí)符用于SNMP協(xié)議操作。

進(jìn)行SNMP查詢

我們將發(fā)送SNMP GET命令以從SNMP代理讀取MIB對(duì)象。為此,我們將調(diào)用同步,高級(jí) getCmd()功能。通過調(diào)用相應(yīng)的函數(shù),可以以不同的方式使用其他SNMP命令。

>>> from pysnmp.hlapi import *
>>> [ x for x in dir() if 'Cmd' in x]
['bulkCmd', 'getCmd', 'nextCmd', 'setCmd']
>>> getCmd
<function getCmd at 0x222b330>

選擇SNMP協(xié)議和憑證

我們可以選擇三種SNMP協(xié)議版本。要使用SNMP版本1或2c,我們傳遞正確初始化的CommunityData類實(shí)例 。對(duì)于第三個(gè)SNMP版本,我們傳遞UsmUserData類實(shí)例。

SNMP社區(qū)名稱以及SNMP v1和v2c之間的選擇通過CommunityData 對(duì)象傳送到SNMP LCD 。

>>> from pysnmp.hlapi import *
>>>
>>> CommunityData('public', mpModel=0)  # SNMPv1
CommunityData('public')
>>> CommunityData('public', mpModel=1)  # SNMPv2c
CommunityData('public')

使用UsmUserData對(duì)象進(jìn)行LCD配置意味著使用SNMPv3。除了設(shè)置USM用戶名外, UsmUserData對(duì)象還可以攜帶加密密鑰和加密協(xié)議到SNMP引擎LCD。

>>> from pysnmp.hlapi import *
>>>
>>> UsmUserData('testuser', authKey='myauthkey')
UsmUserData(userName='testuser', authKey=<AUTHKEY>)
>>> UsmUserData('testuser', authKey='myauthkey', privKey='myenckey')
UsmUserData(userName='testuser', authKey=<AUTHKEY>, privKey=<PRIVKEY>)

PySNMP支持MD5和SHA消息認(rèn)證算法,DES,AES128 / 192/256和3DES加密算法。

為簡單起見,我們使用SNMPv2。雖然完全不安全,但它仍然是最受歡迎的SNMP版本。

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(), CommunityData('public'),
...

設(shè)置傳輸和目標(biāo)

PySNMP支持UDP-over-IPv4和UDP-over-IPv6網(wǎng)絡(luò)傳輸。在此示例中,我們將 在因特網(wǎng)上通過demo.snmplabs.com查詢 IPv4上可用的公共SNMP模擬器。傳輸配置分別以正確初始化或 對(duì)象的形式傳遞給SNMP LCD 。UdpTransportTargetUdp6TransportTarget

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...

尋址SNMP上下文

SNMP上下文是SNMP(v3)消息頭中的參數(shù),用于處理由受管實(shí)體上的SNMP引擎提供的特定MIB集合。SNMP引擎可以提供許多相同的MIB對(duì)象,這些對(duì)象代表完全不同的硬件或軟件實(shí)例。這是可以使用SNMP上下文的地方。

要在高級(jí)API上指示SNMP上下文,ContextData應(yīng)使用正確初始化的 對(duì)象。在本例中,我們將使用'empty'上下文(默認(rèn))。

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...

指定MIB對(duì)象
最后,我們必須指定我們想要讀取的MIB對(duì)象。在協(xié)議級(jí)別,MIB對(duì)象由OID標(biāo)識(shí),但人們傾向于通過名稱來解決它們:

$ snmpget -v2c -c public demo.snmplabs.com SNMPv2-MIB::sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: SunOS zeus.snmplabs.com
$
$ snmpget -v2c -c public demo.snmplabs.com 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: SunOS zeus.snmplabs.com

對(duì)象名稱和OID都來自MIB。名稱和OID鏈接由名為OBJECT-TYPE的高級(jí)SMI構(gòu)造完成。以下是帶有OID ... mgmt.mib-2.system.3和值類型TimeTicks的sysUpTime的示例MIB對(duì)象定義。

sysUpTime OBJECT-TYPE
    SYNTAX      TimeTicks
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
            "The time (in hundredths of a second) since
            the network management portion of the system
            was last re-initialized."
    ::= { system 3 }

在PySNMP中,我們使用ObjectIdentity負(fù)責(zé)MIB對(duì)象識(shí)別的類。ObjectIdentity 表示從人的角度處理MIB對(duì)象的方法。它需要咨詢MIB才能進(jìn)入完全“已解決”的狀態(tài)??梢允褂肕IB對(duì)象名稱初始化ObjectIdentity,在MIB查找后,它開始表現(xiàn)得像OID。

>>> from pysnmp.hlapi import *
>>>
>>> x = ObjectIdentity('SNMPv2-MIB', 'system')
>>> # ... calling MIB lookup ...
>>> tuple(x)
(1, 3, 6, 1, 2, 1, 1, 1)
>>> x = ObjectIdentity('iso.org.dod.internet.mgmt.mib-2.system.sysDescr')
>>> # ... calling MIB lookup ...
>>> str(x)
'1.3.6.1.2.1.1.1'

MIB解析意味著將MIB對(duì)象名稱服務(wù)到OID轉(zhuǎn)換中,反之亦然。

在ObjectType類實(shí)例表示對(duì)象類型中PySNMP SMI constuct。ObjectType是一個(gè)引用ObjectIdentity和SNMP類型實(shí)例的容器對(duì)象。作為Python對(duì)象,它看起來像(OID,value)的元組。

>>> from pysnmp.hlapi import *
>>> x = ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0), 'Linux i386 box'))
>>> # ... calling MIB lookup ...
>>> x[0].prettyPrint()
'SNMPv2-MIB::sysDescr.0'
>>> x[1].prettyPrint()
'Linux i386 box'

尾隨零表示MIB對(duì)象實(shí)例。MIB中描述的對(duì)象只是聲明,它們從不包含任何數(shù)據(jù)。數(shù)據(jù)存儲(chǔ)在MIB對(duì)象實(shí)例中,通過向MIB對(duì)象標(biāo)識(shí)符附加額外信息(稱為索引)來解決。

對(duì)于標(biāo)量MIB對(duì)象,索引按慣例為“0”。該 ObjectIdentity進(jìn)行類采用指數(shù)作為其初始化。

>>> x = ObjectIdentity('SNMPv2-MIB', 'system', 0)
>>> # ... calling MIB lookup ...
>>> tuple(x)
(1, 3, 6, 1, 2, 1, 1, 1, 0)

我們將讀取SNMPv2-MIB模塊中定義的sysDescr標(biāo)量MIB對(duì)象實(shí)例。

>>> from pysnmp.hlapi import *
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))

默認(rèn)情況下,PySNMP將在您的本地文件系統(tǒng)中搜索您引用的ASN.1 MIB文件。它還可以配置為從遠(yuǎn)程主機(jī)自動(dòng)下載它們,如 示例 中所示。我們維護(hù)了一 組可在SNMP項(xiàng)目中使用的ASN.1 MIB模塊。

注意
“ASN.1 MIB”是標(biāo)識(shí)符和類型的純文本描述。它是制造商分發(fā)用于描述其SNMP服務(wù)的通用格式,與Perl的Net :: SNMP和幾乎所有SNMP工具使用的格式相同。

讀取標(biāo)量值
我們終于可以發(fā)送SNMP查詢,并希望收到一些有意義的回復(fù)。

同步API的顯著特點(diǎn)是它是圍繞Python生成器的思想構(gòu)建的。任何函數(shù)調(diào)用都以生成器對(duì)象結(jié)束。對(duì)生成器對(duì)象的迭代執(zhí)行實(shí)際的SNMP通信。在每次迭代中,構(gòu)建并發(fā)送SNMP消息,等待,接收和解析響應(yīng)。

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0)))
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.3.0'), TimeTicks(44430646))])

使用SNMP表

SNMP定義了表的概念。當(dāng)單個(gè)給定的MIB對(duì)象可以應(yīng)用于屬性的許多實(shí)例時(shí),使用表。例如,網(wǎng)絡(luò)接口的屬性被放入SNMP表中。屬性的每個(gè)實(shí)例都通過附加到基本MIB對(duì)象的后綴來尋址。

表在MIB中指定,它們的索引(或索引)通過INDEX子句聲明。表索引是非零整數(shù),或字符串或任何基本SNMP類型。

在協(xié)議級(jí)別,所有索引都形成OID部分。對(duì)于人類舒適地處理索引,SNMP管理應(yīng)用程序依賴于DISPLAY-HINT子句在其OID和SNMP類型特定的,人性化的表示之間進(jìn)行自動(dòng)索引轉(zhuǎn)換。

ifEntry OBJECT-TYPE
    SYNTAX      IfEntry
    INDEX   { ifIndex }
::= { ifTable 1 }

ifIndex OBJECT-TYPE
    SYNTAX      InterfaceIndex
::= { ifEntry 1 }

ifDescr OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..255))
::= { ifEntry 2 }

InterfaceIndex ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "d"
    SYNTAX       Integer32 (1..2147483647)

用PySNMP的說法:

>>> x = ObjectIdentity('IF-MIB', 'ifDescr', 123)
>>> # ... calling MIB lookup ...
>>> str(x)
'1.3.6.1.2.1.2.2.1.2.123'

某些SNMP表由許多索引編制索引。這些索引中的每一個(gè)都成為彼此相連的OID的一部分,并最終成為MIB對(duì)象OID。

從語義角度來看,每個(gè)索引都反映了MIB對(duì)象的重要且不同的屬性。

tcpConnectionEntry OBJECT-TYPE
    SYNTAX  TcpConnectionEntry
    INDEX   { tcpConnectionLocalAddressType,
              tcpConnectionLocalAddress,
              tcpConnectionLocalPort,
              tcpConnectionRemAddressType,
              tcpConnectionRemAddress,
              tcpConnectionRemPort }
::= { tcpConnectionTable 1 }

tcpConnectionLocalPort OBJECT-TYPE
    SYNTAX     InetPortNumber
::= { tcpConnectionEntry 3 }
PySNMP的ObjectIdentity類在人類友好的表示中獲取任意數(shù)量的索引并將它們轉(zhuǎn)換為完整的OID:

>>> x = ObjectIdentity('TCP-MIB', 'tcpConnectionState',
...                    'ipv4', '195.218.254.105', 41511,
...                    'ipv4', '194.67.1.250', 993)
>>> # ... calling MIB lookup ...
>>> str(x)
'1.3.6.1.2.1.6.19.1.7.1.4.195.218.254.105.41511.1.4.194.67.1.250.993'

讓我們?yōu)門CP連接讀取TCP-MIB :: tcpConnectionState對(duì)象:

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('TCP-MIB', 'tcpConnectionState',
...                                      'ipv4', '195.218.254.105', 41511,
...                                      'ipv4', '194.67.1.250', 993)
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.6.19.1.7.1.4.195.218.254.105.41511.1.4.194.67.1.250.993')), Integer(5))])

SNMP命令操作

SNMP允許您請(qǐng)求與給定的MIB對(duì)象“下一步”的MIB對(duì)象。這樣您就可以提前讀取您不知道的MIB對(duì)象。MIB對(duì)象在概念上按其OID排序。此功能由該nextCmd() 功能實(shí)現(xiàn)。

>>> from pysnmp.hlapi import *
>>> g = nextCmd(SnmpEngine(),
...             CommunityData('public'),
...             UdpTransportTarget(('demo.snmplabs.com', 161)),
...             ContextData(),
...             ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr')))
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), DisplayString('SunOS zeus.snmplabs.com'))])
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.2.0'), ObjectIdentity(ObjectIdentifier('1.3.6.1.4.1.8072.3.2.10')))])

通過SNMP代理的MIB對(duì)象迭代生成器對(duì)象“walk”。

SNMPv2c引入了對(duì)GETNEXT命令的重要優(yōu)化- 修訂版本稱為GETBULK,能夠同時(shí)收集和響應(yīng)一堆“下一個(gè)”MIB對(duì)象??梢允褂酶郊拥姆侵欣^器和最大重復(fù)參數(shù)來影響MIB對(duì)象的批處理。

PySNMP 在協(xié)議級(jí)別隱藏了這個(gè)GETBULK優(yōu)化,為方便起見,該 bulkCmd()函數(shù)公開了與getNext()相同的生成器API 。

>>> from pysnmp.hlapi import *
>>>
>>> N, R = 0, 25
>>> g = bulkCmd(SnmpEngine(),
...             CommunityData('public'),
...             UdpTransportTarget(('demo.snmplabs.com', 161)),
...             ContextData(),
...             N, R,
...             ObjectType(ObjectIdentity('1.3.6')))
>>>
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), DisplayString('SunOS zeus.snmplabs.com'))])
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.2.0'), ObjectIdentifier('1.3.6.1.4.1.20408'))])

Python生成器不僅可以生成數(shù)據(jù),還可以將數(shù)據(jù)發(fā)送到正在運(yùn)行的生成器對(duì)象。高級(jí)API使用該功能為一組新的MIB對(duì)象重復(fù)相同的SNMP操作。

>>> from pysnmp.hlapi import *
>>>
>>> g = nextCmd(SnmpEngine(),
...             CommunityData('public'),
...             UdpTransportTarget(('demo.snmplabs.com', 161)),
...             ContextData(),
...             ObjectType(ObjectIdentity('IF-MIB', 'ifTable')))
>>>
>>> g.send([ObjectType(ObjectIdentity('IF-MIB', 'ifInOctets'))])
(None, 0, 0, [(ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.10.1'), Counter32(284817787))])

您可以通過將它們列在單個(gè)PDU中來操作許多不相關(guān)的MIB對(duì)象。響應(yīng)PDU將攜帶MIB對(duì)象及其值的列表,其順序與請(qǐng)求消息中的順序完全相同。

>>> from pysnmp.hlapi import *
>>>
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0))
... )
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), DisplayString('SunOS zeus.snmplabs.com')), ObjectType(ObjectIdentity('1.3.6.1.2.1.1.3.0'), TimeTicks(44430646))])

SNMP的配置管理部分依賴于SNMP SET命令。盡管在管理實(shí)體方面的實(shí)施證明有些苛刻(由于鎖定和交易行為要求)。因此供應(yīng)商傾向于將其排除在外,從而使管理實(shí)體成為只讀。

PySNMP 通過 函數(shù)統(tǒng)一支持SETsetCmd()。

>>> from pysnmp.hlapi import *
>>>
>>> g = setCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0), 'Linux i386')
... )
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), DisplayString('Linux i386'))])

發(fā)送SNMP通知

受管實(shí)體可以向管理實(shí)體發(fā)送未經(jīng)請(qǐng)求的消息。這在SNMP中稱為通知。通知有助于減少輪詢,這可能會(huì)成為大型網(wǎng)絡(luò)的問題。

枚舉SNMP通知,每個(gè)通知都有明確的語義。這是通過名為NOTIFICATION-TYPE的特殊高級(jí)SMI結(jié)構(gòu)完成的 。與定義MIB對(duì)象的OBJECT-TYPE一樣, NOTIFICATION-TYPE具有唯一的OID,但是SNMP值不是引用一系列其他MIB對(duì)象。使用OBJECTS子句指定這些MIB對(duì)象,并且在發(fā)送通知時(shí),它們的當(dāng)前值包含在通知消息中。

linkUp NOTIFICATION-TYPE
    OBJECTS { ifIndex, ifAdminStatus, ifOperStatus }
    STATUS  current
    DESCRIPTION
        "..."
::= { snmpTraps 4 }

為了在PySNMP中建模NOTIFICATION-TYPE構(gòu)造,我們有NotificationType一個(gè)容器對(duì)象的 類。它由ObjectIdentity類標(biāo)識(shí) 并引用一系列ObjectType類實(shí)例。

從行為的角度來看,NotificationType看起來像一系列 ObjectType類實(shí)例。

>>> from pysnmp.hlapi import *
>>>
>>> x = NotificationType(ObjectIdentity('IF-MIB', 'linkUp'))
>>> # ... calling MIB lookup ...
>>> >>> [ str(y) for x in n ]
['SNMPv2-MIB::snmpTrapOID.0 = 1.3.6.1.6.3.1.1.5.3', 'IF-MIB::ifIndex = ', 'IF-MIB::ifAdminStatus = ', 'IF-MIB::ifOperStatus = ']

使用PySNMP發(fā)送通知與發(fā)送SNMP命令沒有太大區(qū)別。不同之處在于如何構(gòu)建PDU變量。SNMP中有兩種不同的通知:trap和 通知。

使用trap,代理與管理器之間的通信是單向的 - 不發(fā)送響應(yīng)或確認(rèn)。

>>> from pysnmp.hlapi import *
>>>
>>> g = sendNotification(SnmpEngine(),
...                      CommunityData('public'),
...                      UdpTransportTarget(('demo.snmplabs.com', 162)),
...                      ContextData(),
...                      'trap',
...                      NotificationType(ObjectIdentity('IF-MIB', 'linkUp'), instanceIndex=(123,))
... )
>>> next(g)
(None, 0, 0, [])

該通知通知是很像的命令。不同之處在于PDU格式。通知用于管理器到管理器的通信以及代理到管理器。

>>> from pysnmp.hlapi import *
>>>
>>> g = sendNotification(SnmpEngine(),
...                      CommunityData('public'),
...                      UdpTransportTarget(('demo.snmplabs.com', 162)),
...                      ContextData(),
...                      'inform',
...                      NotificationType(ObjectIdentity('IF-MIB', 'linkUp'), instanceIndex=(123,))
... )
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.3.0'), TimeTicks(0)), ObjectType(ObjectIdentity('1.3.6.1.6.3.1.1.4.1.0'), ObjectIdentity('1.3.6.1.6.3.1.1.5.4')), ObjectType(ObjectName('1.3.6.1.2.1.2.2.1.1.123'), Null('')), ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.7.123'), Null('')), ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.8.123'), Null(''))])

在后一個(gè)示例中,您可以看到從IF-MIB :: linkUp通知自動(dòng)擴(kuò)展的MIB對(duì)象(ifIndex,ifAdminStatus,ifOperStatus)。要通過索引處理特定的SNMP表對(duì)象行,可以通過 instanceIndex參數(shù)將MIB對(duì)象的索引部分傳遞給NotificationType。

如您所見,擴(kuò)展MIB對(duì)象的實(shí)際值為NULL。那是因?yàn)樵谶@些示例中,我們的簡單腳本無法訪問這些MIB對(duì)象。我們可以通過將NotificationType傳遞給類似字典的對(duì)象來提供缺少的信息,該對(duì)象將MIB對(duì)象OID映射到當(dāng)前值。

>>> from pysnmp.hlapi import *
>>>
>>> mib = {ObjectIdentifier('1.3.6.1.2.1.2.2.1.1.123'): 123,
...        ObjectIdentifier('1.3.6.1.2.1.2.2.1.7.123'): 'testing',
...        ObjectIdentifier('1.3.6.1.2.1.2.2.1.8.123'): 'up'}
>>>
>>> g = sendNotification(SnmpEngine(),
...                      CommunityData('public'),
...                      UdpTransportTarget(('demo.snmplabs.com', 162)),
...                      ContextData(),
...                      'inform',
...                      NotificationType(ObjectIdentity('IF-MIB', 'linkUp'), instanceIndex=(123,), objects=mib)
... )
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.3.0'), TimeTicks(0)), ObjectType(ObjectIdentity('1.3.6.1.6.3.1.1.4.1.0'), ObjectIdentity('1.3.6.1.6.3.1.1.5.4')), ObjectType(ObjectName('1.3.6.1.2.1.2.2.1.1.123'), InterfaceIndex(123)), ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.7.123'), Integer(3)), ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.8.123'), Integer(1))])

大量消息傳遞
在管理大型網(wǎng)絡(luò)時(shí),按順序讀取MIB對(duì)象會(huì)引入延遲。在某種程度上,延遲變得無法忍受。并行化查詢的解決方案是眾所周知的 - 您可以通過將單個(gè)操作卸載到多個(gè)進(jìn)程或多個(gè)執(zhí)行線程或圍繞異步I / O模型構(gòu)建應(yīng)用程序來實(shí)現(xiàn)。

與其他解決方案相比,異步模型最輕量級(jí)且可擴(kuò)展。這個(gè)想法很簡單:永遠(yuǎn)不要等待I / O - 盡可能做其他事情。這背面是執(zhí)行流程變得非線性,這會(huì)傷害人類讀者的程序分析。

PySNMP高級(jí)API適用于與三種流行的異步I / O框架的工作- asyncore,twisted和 asyncio。有關(guān)異步API的更多信息,請(qǐng)參閱PySNMP 庫參考 和示例。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容