Подтвердить что ты не робот

Эффективный и быстрый Python Пока цикл во время использования sleep()

Я пытаюсь связаться с устройством через последовательный порт, используя Pyserial. Поскольку команды необходимо постоянно отправлять, они должны быть помещены в цикл while в Python.

В настоящее время я использую этот код и посмотрел процесс python занимает 100% -ный процессор:

while True:
    #do some serial sending here
    time.sleep(0.2)

Этот код работает. Однако скорость отправки медленная. Я попытался сделать это быстрее, уменьшив интервал sleep, но, похоже, слишком сильно загружает процессор.

Короче говоря, есть ли способ эффективно перебирать цикл while навсегда, сохраняя при этом низкое потребление ресурсов ЦП?

4b9b3361

Ответ 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

Вы должны выяснить компромисс, который вы готовы иметь между скоростью и загрузкой процессора.

Если вам нужно отправлять короткие всплески данных, не делая так много сообщений, возможно, вы можете жить с высокой загрузкой процессора в течение короткого времени, так как средний может все еще быть низким.