0

Pythonコードでマルチプロセッシングを使用しています。
私の python コードは Pysnmp と multiprocessing をインポートします。
私のコードは半分の時間でスムーズに実行されます。
しかし残念なことに、私のコードが機能せず、例外「pyasn1.error.pyasn1 error: type tagset」が表示されることが半分あります。
私のコードは、最初に多数のスレッドで「multiprocessing.dummy.Pool(numOfThreads)」を作成します。
次に、関数「sendSNMPGet」をスレッド関数として受け取る「p.map(sendSNMPGet, [ipRange + '.' + str(x) for x in range(1,256)])」を呼び出し、関数を 255 回呼び出します。 「1-255」の値。
これは私のコードです:

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto.rfc1902 import Integer, IpAddress, OctetString
import multiprocessing.dummy
import multiprocessing
def SNMPGet(ip, community, oid, version = 1):
  generator = cmdgen.CommandGenerator()
  comm_data = cmdgen.CommunityData('server', community, version) # 1 means version SNMP v2c
  transport = cmdgen.UdpTransportTarget((ip, 161),timeout=0.5,retries=2)

  real_fun = getattr(generator, 'getCmd')
  res = (errorIndication, errorStatus, errorIndex, varBinds)\
      = real_fun(comm_data, transport, oid)
  if (errorStatus == 2): #Is there an EndOfMib() Error
      return
  elif (errorIndication is None or errorStatus is True):
      with open("Maprinter.txt", "a") as myfile: myfile.write("Date is: " + datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%S") + " IP is: " + ip + ", Response: %s\n" % varBinds)
      print("IP is: " + ip + ", Response: %s\n" % varBinds)
  return

def sendSNMPGet(ip):
  return SNMPGet(ip, 'public', '1.3.6.1.2.1.43.5.1.1.1.1', 1)

def snmp_range(ipRange, start, end):
  num_threads = 4 * multiprocessing.cpu_count()
  p = multiprocessing.dummy.Pool(num_threads)
  p.map(sendSNMPGet, [ipRange + '.' + str(x) for x in range(start,end)])

def GetIpsRange(ips):
  print('starting scan')
  if __name__ == "__main__":
      if(ips != ''): #if there are ips in registry
          for ip in range(len(ips)):
              snmp_range(ips[ip], 1, 256)
  print('ending scan') 

GetIpsRange('10.0.0')

Pysnmp を使用しているにもかかわらず、マルチプロセッシングの適切なコーディングがないために例外が発生すると思います。この例外を処理するためにコードを変更するにはどうすればよいですか?

4

0 に答える 0