К
Кот в Коде|ИИ и Питон
@cat_with_code3.3K подп.
257просмотров
7.7%от подписчиков
23 марта 2026 г.
questionScore: 283
А как?.. Ч.3 Теперь к теме вопросов-предложений улучшения программ: 1. Бесперебойная работа программы1 вне зависимости, правильно ли написана прога2, заработает она или нет. Как это реализовано: 1. Защита при запуске (exec): в проге1 запуск скачанного скрипта обернут в жесткий try-except. try: with open(PROG_FILE, "r") as f: exec(f.read(), globals()) except Exception as e: self.log("ОШИБКА ЗАПУСКА ПРОГРАММЫ 2:") sys.print_exception(e) Если Программа 2 содержит синтаксическую ошибку (например, await uasyn), она просто выведет ошибку в лог, а цикл проги1 пойдет дальше (спать на 10 минут и качать заново). Прога1 не зависнет. 2. Вопрос о ресурсах: ограничения памяти и приоритезация (Прога3) Если прога2 займёт всё место, то что делать в таком случае? Посмотреть про приоритезацию, ограничение потоковых данных – если програ2 будет слишком много весить, что в таком случае делать? Как-то нужно ли проверять, сколько есть свободной памяти на плате? Сколько можно выделить? Нужно ли проверять, сколько весит файл? Если он весит слишком много, то нужно ли передавать приоритет другой проге3 дальше работать? Как это частично реализовано сейчас: • Есть уже есть лимит на отправку данных для защиты диска логов: if s > MAX_UPLOAD_SIZE: f.seek(s - MAX_UPLOAD_SIZE) Я не пытаюсь загрузить весь CSV файл в память, чтобы не убить RAM. • Защита RAM при парсинге (0 RAM Parser): Потоковый парсер читает файл кусками по 128 байт: chunk = f_in.read(min(bytes_left, 128)) Это значит, что даже если сервер пришлет файл весом в 1 Мегабайт, плата спокойно его отфильтрует, не забив оперативку. Проблема в том, что exec(f.read()) загружает весь код в оперативную память для компиляции. Если прога2 весит слишком много, плата умрет с MemoryError. Можно добавить блок валидации (перед exec): # 1. Узнаем размер скачанного файла prog2.py file_size = os.stat(PROG_FILE)[6] # 2. Узнаем, сколько свободно RAM прямо сейчас free_ram = gc.mem_free() if file_size > 15000: self.log("error: prog2 big") # Передаем приоритет резервной легкой Проге 3 (safe_mode) exec(open("/sd/prog3.py").read(), globals()) elif free_ram < file_size * 2: self.log("error: Not enough RAM to compile") exec(open("/sd/prog3.py").read(), globals()) else: exec(open(PROG_FILE).read(), globals()) Что такое прога3? Это крошечный, заранее "зашитый" на SD-карту скрипт (Fallback/Safe Mode). Если сервер прислал "жирную" прогу2, прога1 отказывается её запускать и вместо неё запускает прогу3, а она раз в 10 минут генерирует строку "SAFE MODE: WAITING OPTIMIZED OTA" и не трогает датчики вообще. Кот в Коде|@kot_research_bot
257
просмотров
2644
символов
Нет
эмодзи
Нет
медиа

Другие посты @cat_with_code

Все посты канала →
А как?.. Ч.3 Теперь к теме вопросов-предложений улучшения пр — @cat_with_code | PostSniper