Эффективный и быстрый Python Пока цикл во время использования sleep()
Я пытаюсь связаться с устройством через последовательный порт, используя Pyserial. Поскольку команды необходимо постоянно отправлять, они должны быть помещены в цикл while в Python.
В настоящее время я использую этот код и посмотрел процесс python занимает 100% -ный процессор:
while True:
#do some serial sending here
time.sleep(0.2)
Этот код работает. Однако скорость отправки медленная. Я попытался сделать это быстрее, уменьшив интервал sleep
, но, похоже, слишком сильно загружает процессор.
Короче говоря, есть ли способ эффективно перебирать цикл while навсегда, сохраняя при этом низкое потребление ресурсов ЦП?
Ответы
Ответ 1
Медленный процессор, потраченный впустую, - это "последовательная отправка". Цикл while с коротким сном будет использовать незначительный процессор.
Вы можете показать серийный код отправки. Возможно, есть способ ускорить это.
На этом довольно медленном CPU я вижу это:
import time
while True: time.sleep(0.2) # 0% CPU
while True: time.sleep(0.02) # 0% CPU
while True: time.sleep(0.002) # 0.5% CPU
while True: time.sleep(0.0002) # 6% CPU
while True: time.sleep(0.00002) # 18% CPU
Теперь выполните дополнительную работу в цикле:
import time
while True: range(10000) and None; time.sleep(0.2) # 1% CPU
while True: range(10000) and None; time.sleep(0.02) # 15% CPU
while True: range(10000) and None; time.sleep(0.002) # 60% CPU
while True: range(10000) and None; time.sleep(0.0002) # 86% CPU
Я запустил те в интерпретаторе и остановил каждый цикл while ctrl-C.
Ответ 2
Что касается вашего комментария к Йоакиму, ответьте:
Тогда ваш код микроконтроллера нуждается в редизайне. В противном случае вы просто превращаете компьютер общего назначения в не что иное, как немой "микроконтроллер", который многократно повторяет ненужный код, следовательно, 100% -ный процессор. Другим симптомом неправильного использования компьютера является тот факт, что скорость вашего аппаратного двигателя зависит от скорости, с которой вы отправляете ей команды через последовательный интерфейс. Вам нужно "командовать" его компьютером, на котором будет размещена ваша логика высокого уровня. И ваш микроконтроллер должен обрабатывать низкоуровневое повторное управление двигателем.
Ответ 3
Вы должны выяснить компромисс, который вы готовы иметь между скоростью и загрузкой процессора.
Если вам нужно отправлять короткие всплески данных, не делая так много сообщений, возможно, вы можете жить с высокой загрузкой процессора в течение короткого времени, так как средний может все еще быть низким.