Форум сайта python.su
Добрый день. Проблема вот с этим скриптом:
# -*- coding: utf-8 -*- from pysnmp.entity.rfc3413.oneliner import cmdgen import re from threading import Thread import time from engine_test import db_refresh SUM = [] # Список ip адресов ASN-ов asn_ip_list = """x.x.x.x""" oid = '.1.3.6.1.4.1.12394.1.20.3.20.19.1.2' # Функция осуществляющая запрос к ASN def snmp_request(oid, ip): # Создаем кортеж элементов oid (1,2,3,4,5) tuple(int(x) for x in list(oid[1:].split("."))) # SNMPwalk errorIndication, errorStatus, errorIndex, varBindTable = cmdgen.CommandGenerator().\ nextCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), oid) if errorIndication: pass # Если ответ есть то ищем в ответе МАК и ОИД else: for mel in list(varBindTable): # Поиска МАКа MAC = re.findall("([a-z0-9]+)'", str(mel)) # Поиск ОИДа OID = re.findall("[\d{1,4}\.*]{100,150}", str(mel)) # Создаем новый ОИД snmp_oid = OID[0].replace('20.19.1.2.31.123.97', "20.19.1.3.31.123.97") # SNMPGet errorIndication_get, errorStatus_get, errorIndex_get, varBindTable_get = cmdgen.CommandGenerator().\ getCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), tuple(int(x) for x in list(snmp_oid.split(".")))) if errorIndication_get: BSID = ["timeout"] else: # Поиск БСИД BSID = re.findall("([a-z0-9]+)'", str(varBindTable_get)) # Создаем новый ОИД snmp_oid = snmp_oid.replace('20.19.1.3.31.123.97', '20.21.1.5.31.123.97') snmp_oid = snmp_oid + ".1" # SNMPGet errorIndication_get, errorStatus_get, errorIndex_get, varBindTable_get = cmdgen.CommandGenerator().\ getCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), tuple(int(x) for x in list(snmp_oid.split(".")))) if errorIndication_get: IP = [errorIndication_get] else: # Поиск IP IP = re.findall("([a-z0-9]+)'", str(varBindTable_get)) SUM.append(MAC + OID + [ip] + BSID + IP) def asn_thread(): Treads = [] # Перебор Ip адресов ASN-ов и для каждого IP создаем поток worker for mil in list(asn_ip_list.split("\n")): worker = Thread(target=snmp_request, args=(oid, mil,)) worker.setDaemon(False) worker.start() Treads.append(worker) time.sleep(2) # Проверяем живы ли потоки for t in Treads: while t.isAlive(): time.sleep(1) db_refresh(SUM) asn_thread()
for t in Treads: if (t.isAlive()): print t,t.isAlive() t._Thread_delete()
Отредактировано noob_saibot (Июнь 11, 2015 11:27:51)
Офлайн
Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.
Офлайн
RodegastСтавил True проблема сохраняется, потоков не более 50.
Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.
Офлайн
50 всё таки многовато… Я бы делал что-то вроде такого+принудительное завершение по истечению определённого времени:
Treads = {} def snmp_request(oid, ip): .... del Treads[ip] # Перебор Ip адресов ASN-ов и для каждого IP создаем поток worker for mil in list(asn_ip_list.split("\n")): worker = Thread(target=snmp_request, args=(oid, mil,)) worker.setDaemon(False) worker.start() Treads.update({mil:worker}) time.sleep(2) # Проверяем живы ли потоки while Treads: time.sleep(1)
Отредактировано Rodegast (Июнь 11, 2015 16:14:08)
Офлайн