Найти - Пользователи
Полная версия: Зависание процессов
Начало » Центр помощи » Зависание процессов
1
noob_saibot
Добрый день. Проблема вот с этим скриптом:
# -*- 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. Если видите то из-за чего может у нормального программиста кровь из глаз идти, прошу отписать мне
Rodegast
Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.
noob_saibot
Rodegast
Сколько у тебя одновременно создаётся потоков? Насколько помню если поток блокирован, то isAlive может не отработать, но это не точно. Попробуй потоки сделать нитями (worker.setDaemon(True)) может поможет.
Ставил True проблема сохраняется, потоков не более 50.
Rodegast
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB