Друзья, подскажите, пожалуйста, в чем может быть дело? Скрипт: Код (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%, что приемлемо. В целом, эта версия скрипта работает как надо, вот только загрузка процессора очень большая. Подскажите, как этого можно избежать? Спасибо
Не надо программировать ОС с вытесняющей многозадачностью как микроконтроллер. Пользуйтейсь time.sleep() и не стесняйтесь.
Спасибо, дядя Витя, за ответ. Это мои первые эксперименты с Raspberi и Python, до этого были только Ардуины, наверное и подход оттуда был взят. Первым делом я и обратился к time.sleep(), но тут такая загвоздка: в "проекте" есть еще аппаратная кнопка, по нажатию на которую нужно выполнять тут или иную функцию (в данном куске кода выполняется view_temp()). Предположим: нажимаем кнопку и начинает выполнятся другая функция, например view_data_time(), нажимаем еще раз - третью функция и т.д. Так вот, кнопку же нужно постоянно опрашивать (смотреть состояние пина, к которому она подключена), а sleep() просто останавливает работу скрипта на заданное время и в это время кнопка "недоступна". Конечно, это все еще подход программирования микроконтроллеров, но у меня пока только такие умения. Может кто подскажет, как реализовать по-другому эту задачу? Хотя все же, больше интересно, почему происходит такая загрузка процессора?
Кнопки обрабатываются прерываниями. Загрузка процессора потому что вы его загрузили своей программой. Если программа выполняется 100% времени, то она загружает 100% процессора, как ни удивительно.
Я не знаю, насколько выразительно/понятно я описал проблему? если что-то непонятное в моем вопросе? Ситуация такая: запускаешь скрипт - загрузка одного ядра 100% этим процессом, останавливаешь, комментируешь одну строку (так что обозначена в коде # вот эта строка), запускаешь снова - загрузка ядра процессора 8-9%. Как так? что такого в этой строчке то?
Эта строка ограничивает вызовы view_temp. Где-то в нутре view_temp есть ожидание событий периферии, которое блокирует программу, освобождая процессор. Скорее всего дисплей. Т.е. бутылочным горлышком, загруженным на 100% становится что-то другое, нежели процессор.
Я, как и предыдущий оратор, ничего не понимаю в Python, но вам искать темы на тему "асинхронное программирование Python" типа: http://bugbug.pythonanywhere.com/2 и на форум его, Python, любителей.
Спасибо за ответ! Видимо действительно мне нужно менять подход с "программирование микроконтроллеров" на " программирование ОС с вытесняющей многозадачностью") За сегодня уже второй раз слышу про асинхронное программирование.
Нет. ОС здесь может иметь место, но говоря о вашей задаче, лучше иметь в виду событийное асинхронное программирование на языке Python.
Вот что добавлю. Я НЕ ЗНАЮ Python, но уверен в том что сказал выше. Возможно (!!!) есть вариант проще - библиотека таймеров, когда создаются оные и как аргумент им передаётся функция реакции на то или иное событие. Это проще асинхрона, но есть такое в Python или нет я не знаю. Поищите.
Это я имел в виду высказывание дяди Вити о моем подходе к программированию PRi) С Python'ом я знаком дня три, кажется. До асинхронного программирования, наверное, еще далековато, но теперь буду знать в какую сторону двигаться. Начал читать статью по вашей ссылке, да, кажется это то, что нужно! Еще раз спасибо за ответ.