2016-09-01 2 views
0

Ich teste pysnmp asyncio Modul und als Start verwendet sample program zusammen mit der Dokumentation zur Verfügung gestellt. Wenn ich das Beispielprogramm ausführe, gibt es den Task was destroyed but it is pending! Fehler. Ich habe SO nach ähnlichen Fragen überprüft und konnte nicht finden, was mit meinen (unerfahrenen) Augen falsch ist. Ich verwende Python 3.4.2 und asyncio die mit ihm kamen und pysnmp (4.3.2) auf Debian 8.5asyncio "Aufgabe wurde zerstört, aber sie steht noch aus!" in pysnmp Beispielprogramm

Das Programm, das ich mit (das gleiche wie das Beispielprogramm in pysnmp Dokumentation)


    import asyncio 
    from pysnmp.hlapi.asyncio import * 


    @asyncio.coroutine 
    def getone(snmpEngine, hostname): 
     errorIndication, errorStatus, errorIndex, varBinds = yield from getCmd(
      snmpEngine, 
      CommunityData('public'), 
      UdpTransportTarget(hostname), 
      ContextData(), 
      ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)) 
     ) 

     if errorIndication: 
      print(errorIndication) 
     elif errorStatus: 
      print('%s at %s' % (
       errorStatus.prettyPrint(), 
       errorIndex and varBinds[int(errorIndex) - 1][0] or '?' 
      ) 
       ) 
     else: 
      for varBind in varBinds: 
       print(' = '.join([x.prettyPrint() for x in varBind])) 


    @asyncio.coroutine 
    def getall(snmpEngine, hostnames): 
     for hostname in hostnames: 
      yield from getone(snmpEngine, hostname) 


    snmpEngine = SnmpEngine() 

    loop = asyncio.get_event_loop() 
    loop.run_until_complete(getall(snmpEngine, [('demo.snmplabs.com', 1161), 
               ('demo.snmplabs.com', 2161), 
               ('demo.snmplabs.com', 3161)])) 

Fehler ist:



    Executing wait_for= cb=[_raise_stop_error() at /usr/lib/python3.4/asyncio/base_event 
    s.py:101] created at /usr/lib/python3.4/asyncio/base_events.py:264> took 0.460 seconds 
    SNMPv2-MIB::sysDescr.0 = SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m 
    SNMPv2-MIB::sysDescr.0 = SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m 
    SNMPv2-MIB::sysDescr.0 = SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m 
    Task was destroyed but it is pending! 
    source_traceback: Object created at (most recent call last): 
     File "multiple-sequential-queries.py", line 58, in 
     ('demo.snmplabs.com', 3161)])) 
     File "/usr/lib/python3.4/asyncio/base_events.py", line 271, in run_until_complete 
     self.run_forever() 
     File "/usr/lib/python3.4/asyncio/base_events.py", line 244, in run_forever 
     self._run_once() 
     File "/usr/lib/python3.4/asyncio/base_events.py", line 1075, in _run_once 
     handle._run() 
     File "/usr/lib/python3.4/asyncio/events.py", line 120, in _run 
     self._callback(*self._args) 
     File "/usr/lib/python3.4/asyncio/tasks.py", line 237, in _step 
     result = next(coro) 
     File "/usr/lib/python3.4/asyncio/coroutines.py", line 79, in __next__ 
     return next(self.gen) 
     File "multiple-sequential-queries.py", line 50, in getall 
     yield from getone(snmpEngine, hostname) 
     File "/usr/lib/python3.4/asyncio/coroutines.py", line 79, in __next__ 
     return next(self.gen) 
     File "multiple-sequential-queries.py", line 31, in getone 
     ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)) 
     File "/usr/lib/python3.4/asyncio/coroutines.py", line 79, in __next__ 
     return next(self.gen) 
     File "/usr/lib/python3.4/asyncio/coroutines.py", line 141, in coro 
     res = func(*args, **kw) 
     File "/usr/local/lib/python3.4/dist-packages/pysnmp/hlapi/asyncio/cmdgen.py", line 138, in getCmd 
     addrName, paramsName = lcd.configure(snmpEngine, authData, transportTarget) 
     File "/usr/local/lib/python3.4/dist-packages/pysnmp/hlapi/lcd.py", line 87, in configure 
     transport 
     File "/usr/local/lib/python3.4/dist-packages/pysnmp/entity/config.py", line 308, in addTransport 
     transport) 
     File "/usr/local/lib/python3.4/dist-packages/pysnmp/carrier/asyncio/dispatch.py", line 70, in registerTransport 
     self.loopingcall = asyncio.async(self.handle_timeout()) 
    task: :4> wait_for= created at /usr/local/lib/python3.4/dist-packages/pysnmp/carrier/asyncio/dispatch.py:70> 

Irgendwelche Hilfe, zum heraus herauszufinden ist sehr geschätzt!

Danke.

+0

Das sieht aus wie ein Fehler in pysnmp im Zusammenhang mit der periodischen Timer-Funktion Abbruch beim Herunterfahren. Hier finden Sie weitere Informationen zum Thema https://docs.python.org/3/library/asyncio-dev.html#asyncio-pending-task-destroyed. Das Öffnen eines Problems oder das Senden von PR in GitHub kann ein Weg sein. ;) –

+0

Danke! Lass mich ein Problem aufmachen. – Raj

Antwort

0

Es gibt eine interne Timer-Funktion in pysnmp, die für die Behandlung von Caches, Wiederholungen usw. verwendet wird. Beim asyncio-Transport wird dieser Timer von asyncio Future gesteuert. Die Nachricht, die Sie beobachten, weist Sie darauf hin, dass das Future-Objekt noch aussteht, bevor die Hauptschleife heruntergefahren wird.

Um das zu beheben, müssen Sie die ausstehende Zeitgeberaufgabe abbrechen, sobald Sie alle SNMP-E/A abgeschlossen haben. A [hackerish] Weg, dies zu tun wäre, um das folgende Snippet zum Beispiel Skript anhängen Sie erwähnt:

... 

snmpEngine = SnmpEngine() 

loop = asyncio.get_event_loop() 

loop.run_until_complete(getall(snmpEngine, [('demo.snmplabs.com', 1161), 
              ('demo.snmplabs.com', 2161), 
              ('demo.snmplabs.com', 3161)])) 

# run a coroutine to cancel pending timer task 

from pysnmp.hlapi.asyncore.cmdgen import lcd 

@asyncio.coroutine 
def unconfigure(snmpEngine, authData=None): 
    lcd.unconfigure(snmpEngine, authData) 

loop.run_until_complete(unconfigure(snmpEngine)) 

ich über das Hinzufügen von ähnlichen Koroutine in pysnmp arbeite, damit Sie es out-of-the-box laufen konnte .

Verwandte Themen