Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 11, 2015 11:22:53

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Зависание процессов

Добрый день. Проблема вот с этим скриптом:

# -*- 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()
При запуске данного скрипта под дебианом рекурсивно либо по таймингу (раз в 10 минут) в системе создаются процессы для каждого потока, но при завершении работы скрипта, они продолжают висеть в памяти, что при повторных запусках приводит к падению системы. Вопрос: почему проверка на состояние потока не отрабатывает? Или почему отрабатывает некорректно? Где я накосячил?
Помогло только:
    for t in Treads:
        if (t.isAlive()):
                print t,t.isAlive()
                t._Thread_delete()
Принт не пишет какие потоки зависли.

PS. Если видите то из-за чего может у нормального программиста кровь из глаз идти, прошу отписать мне

Отредактировано noob_saibot (Июнь 11, 2015 11:27:51)

Офлайн

#2 Июнь 11, 2015 11:55:00

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Зависание процессов

Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июнь 11, 2015 14:34:25

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Зависание процессов

Rodegast
Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.
Ставил True проблема сохраняется, потоков не более 50.

Офлайн

#4 Июнь 11, 2015 16:11:14

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Зависание процессов

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version