Python eficiente y rápido mientras loop durante el uso de sleep()


Estoy intentando comunicarme con un dispositivo a través de serial usando Pyserial. Como los comandos necesitan ser enviados continuamente, tienen que ser colocados en un bucle while en Python.

Actualmente estoy usando este código, y he echado un vistazo a el proceso de python toma 100% CPU :

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

Este código funciona. Sin embargo, la velocidad de envío es lenta. Traté de hacerlo más rápido disminuyendo el intervalo sleep, pero parece cargar la CPU un poco demasiado.

En resumen, ¿hay alguna ¿cómo iterar de manera efectiva durante un bucle de tiempo para siempre, mientras se mantiene un bajo consumo de recursos de CPU?

Author: Community, 2012-06-07

3 answers

La parte de desperdicio lento de CPU es el "hacer envío en serie". El bucle while con solo un corto sueño usará CPU insignificante.

Puede mostrar el código de envío de serie. Puede haber una manera de acelerar eso.

En esta CPU bastante lenta veo esto:

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

Ahora haz un trabajo extra en el bucle:

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

Los ejecuté en el intérprete y detuve cada bucle while con ctrl-C.

 42
Author: John La Rooy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-07 09:54:12

En lo que respecta a su comentario sobre la respuesta de Joachim:

Entonces su código de microcontrolador necesita un rediseño. De lo contrario, solo estás convirtiendo tu computadora de propósito general en nada más que un tonto "microcontrolador" que itera sobre código innecesario repetidamente, de ahí la cpu 100%. Otro síntoma de que utilice su computadora incorrectamente es el hecho de que la velocidad del motor de su hardware depende de la velocidad a la que le envíe comandos a través de la interfaz serie. Es necesario "comando" con la computadora que alojará su lógica de alto nivel. Y su microcontrolador necesita manejar el control repetativo de bajo nivel del motor.

 4
Author: Zoran Pavlovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-27 18:48:55

Usted tiene que averiguar la compensación que está dispuesto a tener entre la velocidad y la carga de la CPU.

Si tiene que enviar ráfagas cortas de datos, mientras no hace tanto entre mensajes, entonces tal vez pueda vivir con una alta carga de CPU durante un corto tiempo, ya que el promedio aún podría ser bajo.

 3
Author: Some programmer dude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-07 05:59:36