Time.time() - грузит процессор Rasbperi Pi

Тема в разделе "Raspberry Pi", создана пользователем Dr.Norfolk, 21 мар 2019.

Метки:
  1. Dr.Norfolk

    Dr.Norfolk Нуб

    Друзья, подскажите, пожалуйста, в чем может быть дело?
    Скрипт:
    Код (Python):

    #!/usr/bin/python
    import os
    import time

    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)

    import RPi_I2C_driver

    mylcd = RPi_I2C_driver.lcd()

    uptime = 0
    last_time = 0
        while True:
            uptime = int(time.time())

                if(uptime - last_time > 5):
                    view_temp()
                    last_time = uptime  # вот эта строка

    def view_temp():
        cpu_tempC = get_cpu_tempC()
        gpu_tempC = get_gpu_tempC()
        cpuT = "CPU temp: %.2f" % cpu_tempC
        gpuT = "GPU temp: %.2f" % gpu_tempC
        mylcd.lcd_display_string(cpuT + "C", 1)
        mylcd.lcd_display_string(gpuT + "C", 2)

    def get_cpu_tempC():
            tempFile = open("/sys/class/thermal/thermal_zone0/temp")
            cpu_temp = tempFile.read()
            tempFile.close()
            return float(cpu_temp)/1000

    def get_gpu_tempC():
            gpu_temp = commands.getoutput( '/opt/vc/bin/vcgencmd measure_temp' ).replace( 'temp=', '' ).replace( '\'C', '' )
            return float(gpu_temp)
     
    Скрипт получает значения температур и выводит их на LCD-дисплей.
    Хотел организовать вывод на дисплей, например, с паузой раз в 5 секунд чтобы это не происходило очень быстро, т.к. данные постоянно меняются, чтоб на дисплее сильно быстро не менялись значения.
    Беру time.time() и помещаю в переменную uptime, затем отнимаю от нее время последнего вывода на дисплей и смотрю, стало ли значение больше на 5, если да - то вывожу снова. Это что-то вроде работы с millis() Arduino, чтобы избежать использования delay(),который останавливает работу программы совсем (ну а для python - это time.sleep(), конечно же).

    Так вот в момент присваивания настоящего значение времени переменную last_time(), время последнего выполнения, одно ядро процессора Raspbery грузится до 100% (в коде помечено # вот эта строка). если эту строку закомментировать, данные выводятся постоянно, т.е. очень быстро меняются, но процессора это занимает 8-9%, что приемлемо.

    В целом, эта версия скрипта работает как надо, вот только загрузка процессора очень большая. Подскажите, как этого можно избежать? Спасибо
     
  2. Не надо программировать ОС с вытесняющей многозадачностью как микроконтроллер. Пользуйтейсь time.sleep() и не стесняйтесь.
     
  3. Dr.Norfolk

    Dr.Norfolk Нуб

    Спасибо, дядя Витя, за ответ. Это мои первые эксперименты с Raspberi и Python, до этого были только Ардуины, наверное и подход оттуда был взят.
    Первым делом я и обратился к time.sleep(), но тут такая загвоздка: в "проекте" есть еще аппаратная кнопка, по нажатию на которую нужно выполнять тут или иную функцию (в данном куске кода выполняется view_temp()). Предположим: нажимаем кнопку и начинает выполнятся другая функция, например view_data_time(), нажимаем еще раз - третью функция и т.д.
    Так вот, кнопку же нужно постоянно опрашивать (смотреть состояние пина, к которому она подключена), а sleep() просто останавливает работу скрипта на заданное время и в это время кнопка "недоступна". Конечно, это все еще подход программирования микроконтроллеров, но у меня пока только такие умения.
    Может кто подскажет, как реализовать по-другому эту задачу?
    Хотя все же, больше интересно, почему происходит такая загрузка процессора?
     
  4. Кнопки обрабатываются прерываниями. Загрузка процессора потому что вы его загрузили своей программой. Если программа выполняется 100% времени, то она загружает 100% процессора, как ни удивительно.
     
  5. Dr.Norfolk

    Dr.Norfolk Нуб

    Я не знаю, насколько выразительно/понятно я описал проблему? если что-то непонятное в моем вопросе?
    Ситуация такая: запускаешь скрипт - загрузка одного ядра 100% этим процессом, останавливаешь, комментируешь одну строку (так что обозначена в коде # вот эта строка), запускаешь снова - загрузка ядра процессора 8-9%. Как так? что такого в этой строчке то?
     
  6. Эта строка ограничивает вызовы view_temp. Где-то в нутре view_temp есть ожидание событий периферии, которое блокирует программу, освобождая процессор. Скорее всего дисплей. Т.е. бутылочным горлышком, загруженным на 100% становится что-то другое, нежели процессор.
     
    Dr.Norfolk нравится это.
  7. ИгорьК

    ИгорьК Оракул Модератор

    Я, как и предыдущий оратор, ничего не понимаю в Python, но вам искать темы на тему "асинхронное программирование Python" типа: http://bugbug.pythonanywhere.com/2 и на форум его, Python, любителей.
     
    Последнее редактирование: 21 мар 2019
    arkadyf нравится это.
  8. Dr.Norfolk

    Dr.Norfolk Нуб

    Да, такая мысль мне не приходила. Это объясняет положение дел. Спасибо.
     
  9. Dr.Norfolk

    Dr.Norfolk Нуб

    Спасибо за ответ! Видимо действительно мне нужно менять подход с "программирование микроконтроллеров" на " программирование ОС с вытесняющей многозадачностью") За сегодня уже второй раз слышу про асинхронное программирование.
     
  10. ИгорьК

    ИгорьК Оракул Модератор

    Нет. ОС здесь может иметь место, но говоря о вашей задаче, лучше иметь в виду событийное асинхронное программирование на языке Python.
     
    arkadyf нравится это.
  11. ИгорьК

    ИгорьК Оракул Модератор

    Вот что добавлю. Я НЕ ЗНАЮ Python, но уверен в том что сказал выше.
    Возможно (!!!) есть вариант проще - библиотека таймеров, когда создаются оные и как аргумент им передаётся функция реакции на то или иное событие.

    Это проще асинхрона, но есть такое в Python или нет я не знаю. Поищите.
     
  12. Dr.Norfolk

    Dr.Norfolk Нуб

    Это я имел в виду высказывание дяди Вити о моем подходе к программированию PRi)
    С Python'ом я знаком дня три, кажется. До асинхронного программирования, наверное, еще далековато, но теперь буду знать в какую сторону двигаться. Начал читать статью по вашей ссылке, да, кажется это то, что нужно!
    Еще раз спасибо за ответ.
     
  13. Dr.Norfolk

    Dr.Norfolk Нуб

    Да, это бы подошло сюда хорошо. Поищу.

    Спасибо, всем за участие!
     
  14. библиотека в питоне называется threading
     
    arkadyf и Dr.Norfolk нравится это.
  15. Dr.Norfolk

    Dr.Norfolk Нуб

    Да, спасибо! Это кажется то, что нужно!