@Only4You

Как сделать грамотный счетчик в питоне?

Добрый день, уважаемые знатоки.
В общем делаю скрипт с использованием сетевого реле, для перезагрузки в/камер и встал.
Проверяю доступность камер путём цикличного пинга, но встал вопрос как сдлеать элегантный счетчик, чтоб например при 5 неудачных попытках запускалась функция перезагрузки, а так же счетчик для общего количества перезагрузок.
Я понимаю как это легко реализовать через global, но пока искал информацию, везде натыкался на то, что глобальные переменные - зло, без объяснения причины конечно, но с моим опытом приходится принимать на веру.
Поэтому хотелось бы узнать, как можно реализовать это по фен шуй и правильно.
Вот пример метода
IP12 = '192.168.0.100'
IP13 = '192.168.0.101'
RODOS12 = '192.168.1.100'
RODOS13 = '192.168.1.101'

def cameras_checker(self):
    while True:
        r_dict = {'Купол 12': IP12, 'Купол 13':IP13}
        for key, val in r_dictitems():
            cmd = f'ping {val} -n 1 -w 100
            response = subprocesscall(cmd, stdout=subprocess.DEVNUL)
            if not response:
                print(f'Camera {key}- OK')
                счетчик неудач 12 или 13 купола = 0 # При появлении пинга необходимо обнулить
            else:
                if key == 'Купол 12':
                    счетчик неудач 12 купола += 1 # Прибавляем 1 неудачную попытку к 12 куполу
                    print(f'Camera {key}- Died')
                    if счетчик неудач = 5:
                        self.cameras_reboot(RODOS12)
                else:
                    счетчик неудач 13 купола += 1 # Прибавляем 1 неудачную попытку к 13 куполу
                    print(f'Camera {key}- Died')
                    if счетчик неудач = 5:
                        self.cameras_reboot(RODOS13)
        sleep(5)

def cameras_reboot(self, ip)
    счетчик перезагрузок 12 или 13 купола += 1 # Прибавляем 1 перезагрузкам 12 или 13 купола
    ...
    функция перезагрузки реле
    ...

def info(self)
    print(f'Перезагрузок купол 12 {счетчик перезагрузок 12}\nf'Перезагрузок купол 13 {счетчик перезагрузок 13}')


Надеюсь понятно описал что имеем, а чего хотим (:
  • Вопрос задан
  • 160 просмотров
Решения вопроса 2
grantur5707
@grantur5707
Full Stack Web Developer
По феншую и правильно по хорошему бы реализовать класс, в котором будешь хранить состояние счётчиков

import subprocess
from time import sleep

class CameraMonitor:
    def __init__(self):
        self.IP12 = '192.168.0.100'
        self.IP13 = '192.168.0.101'
        self.RODOS12 = '192.168.1.100'
        self.RODOS13 = '192.168.1.101'
        
        self.fail_count = {'Купол 12': 0, 'Купол 13': 0}
        self.reboot_count = {'Купол 12': 0, 'Купол 13': 0}

    def ping_camera(self, ip):
        cmd = f'ping {ip} -n 1 -w 100'
        response = subprocess.call(cmd, stdout=subprocess.DEVNULL)
        return response == 0

    def cameras_checker(self):
        r_dict = {'Купол 12': self.IP12, 'Купол 13': self.IP13}
        while True:
            for camera, ip in r_dict.items():
                if self.ping_camera(ip):
                    print(f'Camera {camera} - OK')
                    self.fail_count[camera] = 0
                else:
                    self.fail_count[camera] += 1
                    print(f'Camera {camera} - Died')

                    if self.fail_count[camera] >= 5:
                        self.cameras_reboot(camera)

            sleep(5)

    def cameras_reboot(self, camera):
        if camera == 'Купол 12':
            ip = self.RODOS12
        else:
            ip = self.RODOS13
        
        self.reboot_count[camera] += 1 
        print(f'Rebooting {camera} at IP {ip}')

    def info(self):
        for camera, count in self.reboot_count.items():
            print(f'Перезагрузок {camera}: {count}')


if __name__ == "__main__":
    monitor = CameraMonitor()
    monitor.cameras_checker()
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как-то так
def cameras_checker(self):
    cameras = [
        {'name': 'Купол 12', 'ip': IP12, 'rebootIp': RODOS12, 'fails': 0},
        {'name': 'Купол 13', 'ip': IP13, 'rebootIp': RODOS13, 'fails': 0},
    ]
    while True:
        for camera in cameras:
            cmd = f"ping {camera['ip']} -n 1 -w 100"
            response = subprocesscall(cmd, stdout=subprocess.DEVNUL)
            if not response:
                print(f'Camera {camera['name']} ok')
                camera['fails'] = 0
            else:
                camera['fails'] += 1
                print(f"Camera {camera['name']} died")
                if camera['fails'] = 5:
                    self.cameras_reboot(camera['rebootIp'])
        sleep(5)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы