2012-06-07 26 views
21

Estoy intentando comunicarme con un dispositivo en serie utilizando Pyserial. Como los comandos deben enviarse continuamente, deben colocarse en un ciclo while en Python.Pitón eficiente y rápido While while while sleep()

actualmente estoy usando el código, y han echado un vistazo a python process takes 100% CPU: trabaja

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

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

En resumen, ¿hay alguna manera de iterar con eficacia durante un ciclo while para siempre, mientras se mantiene un bajo consumo de recursos de CPU?

+0

basado en esta [publicación] (http://stackoverflow.com/questions/529034/python-pass-or-sleep-for-long-running-processes), time.sleep tiene muy poca sobrecarga, es posible que desee para verificar el número de serie que envía el código – xvatar

+1

¿Ha intentado dormir por 0.00001? Puede parecer ridículo, pero ese retraso puede hacer toda la diferencia en el mundo para tu CPU. Por favor pruebalo. – jakebird451

+0

¿Cómo puede una computadora moderna romper el sudor escribiendo en un puerto serie? ¿No se bloquearía serial.Serial(). Write() al escribir? ¿Eso parece tiempo suficiente para que la CPU haga otras cosas? – Bittrance

Respuesta

37

La parte lenta de pérdida de CPU es el "envío en serie". El ciclo while con solo un breve descanso usará una CPU insignificante.

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

En esta bastante lento CPU 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 hacer 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 

que corrieron los de la intérprete y se detuvo cada bucle while con ctrl- DO.

+0

Alternativamente, podría limitar el paso a la serie usando un interruptor, sin embargo, los medios también reprograman el dispositivo incorporado. El código se ve algo como \t comando = 'w' \t while True: \t \t si (comando = x!): \t \t \t #pyserial enviar la cadena aquí, en este caso w. cambiado a través del controlador externo. \t \t otra cosa: \t \t \t #tell PySerial para cerrar la conexión – jhtong

+0

Parece que tengo que poner en práctica un control de conmutación en el equipo y en el lado del microprocesador, para reducir el número de órdenes enviadas. Luego adhiérete a modo de suspensión (0.2) para que el uso de la CPU no sea tan alto. es decir, guarde el último comando, y si se ha enviado, no lo envíe de nuevo. mientras tanto, el microprocesador esperará un comando de detención 'x'. Si no se recibe, continuará procesando el comando actual/anterior a su propio ritmo. – jhtong

+0

Si su microcontrolador "continuará procesando el comando actual a su propio ritmo", entonces NO se necesita un ciclo while en su código python. Dudo que cualquier tipo de biblioteca para la comunicación en puerto serie te requiera llamar cualquier ciclo. Tal vez vuelva a leer la documentación de la biblioteca ya que parece que la está utilizando mal. –

3

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

Si tiene que enviar breves ráfagas de datos, aunque no hace tanto entre los mensajes, entonces puede vivir con una carga de CPU alta durante un tiempo corto ya que el promedio puede ser aún bajo.

+0

Gracias, sin embargo, eso puede significar la reprogramación del microcontrolador para usar interruptores. Tiene que seguir adelante, por lo tanto, debe enviarse 'w'. Si no se detecta la tecla 'w', el motor no se moverá. Por lo tanto, si se envía demasiado lento, el motor se moverá aún más lento. – jhtong

4

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

A continuación, el código del microcontrolador necesita un rediseño. De lo contrario, solo estás convirtiendo tu computadora de propósito general en nada más que un "microcontrolador" tonto que itera repetidamente sobre el código innecesario, de ahí el 100% de la CPU. Otro síntoma de que está utilizando su computadora de forma incorrecta es el hecho de que la velocidad de su motor de hardware depende de la velocidad a la que le envía comandos a través de la interfaz en serie. Debe "mandarlo" a la computadora que alojará su lógica de alto nivel. Y su microcontrolador necesita manejar el control de bajo nivel y repetitivo del motor.

+1

+1 para leer entre líneas. – Vorac