Rápido y Preciso de Python Repetición del contador

Tengo que enviar la repetición de los mensajes de una lista de forma rápida y precisa. Una lista de necesidades para enviar los mensajes, cada 100ms, con un +/- 10 ms ventana. He intentado utilizar el siguiente código, pero el problema es que el temporizador de espera de los 100ms, y luego todo el cálculo se debe hacer, haciendo que el temporizador de la caída de la aceptable ventana.

Simplemente disminuyendo el tiempo de espera es un desordenado, y poco de hack. El que hay un Bloqueo en el bucle de mensajes en el caso de que la lista se corrigen durante el bucle.

Pensamientos sobre cómo obtener python para enviar mensajes constantemente alrededor de 100ms? Gracias

from threading import Timer
from threading import Lock

class RepeatingTimer(object):
    def __init__(self,interval, function, *args, **kwargs):
        super(RepeatingTimer, self).__init__()
        self.args = args
        self.kwargs = kwargs
        self.function = function
        self.interval = interval
        self.start()

    def start(self):
        self.callback()

    def stop(self):
        self.interval = False

    def callback(self):
        if self.interval:
            self.function(*self.args, **self.kwargs)
            Timer(self.interval, self.callback, ).start()

def loop(messageList):
    listLock.acquire()
    for m in messageList:
        writeFunction(m)
    listLock.release()


MESSAGE_LIST = [] #Imagine this is populated with the messages
listLock = Lock()
rt = RepeatingTimer(0.1,loop,MESSAGE_LIST)
#Do other stuff after this

Entiendo que los writeFunction va a causar un poco de retraso, pero no más que el 10 ms permitido. Me esencialmente necesario llamar a la función de cada 100ms para cada mensaje. El messagelist es pequeño, por lo general menos de los elementos.

El próximo desafío es el de tener este trabajo con cada 10ms, +/-1 ms 😛

  • ‘trabajar con cada 10ms, +/-1 ms’ buena suerte con eso 🙁
InformationsquelleAutor dwpriest | 2013-03-23

3 Kommentare

  1. 10

    Sí, la simple espera es complicado y hay mejores alternativas.

    Primero apagado, usted necesita una alta precisión del temporizador en Python. Hay un par de alternativas y dependiendo de su sistema operativo, es posible que desee elegir el más fiel.

    Segundo, usted debe ser consciente de la fundamentos de la multitarea preferente y entender que no es de alta precisión sleep función, y que su resolución real diferirá de la SO SO demasiado. Por ejemplo, si estamos hablando de Windows, el mínimo intervalo del sueño podría ser alrededor de 10-13 ms.

    Y en tercer lugar, recuerda que siempre es posible esperar una muy precisa intervalo de tiempo (asumiendo que usted tiene un temporizador de alta resolución), pero con un trade-off de alta carga de CPU. La técnica se llama la espera ocupada:

    while(True):
        if time.clock() == something:
             break

    Así, la solución real es crear un híbrido de temporizador. Se va a utilizar de forma regular sleep función a esperar la mayor parte del intervalo y, a continuación, va a empezar a sondear la alta precisión del temporizador en el bucle, mientras que haciendo el sleep(0) truco. Sleep(0) voluntad (dependiendo de la plataforma) esperar la menor cantidad posible de tiempo, liberando el resto del tiempo restante de la rebanada para otros procesos de conmutación y el contexto de CPU. He aquí un discusión.

    La idea es minuciosamente descrito en el Ryan Geiss del Tiempo en Win32 artículo. Es en C y para las API de Windows, pero los principios básicos se aplican aquí también.

    • ¿no es más seguro para el momento de la comprobación.clock() >= algo ? Yo creo que hay un riesgo de que el «tiempo.clock()» va a saltar por encima de «algo» un poco
    • No te dejes engañar por la fantasía ‘ocupado en espera’ de la etiqueta ;-). Es una muy mala práctica y deben ser evitados siempre que sea posible.
  2. 0

    De la tienda a la hora de inicio. Enviar el mensaje. Obtener el tiempo del fin. Calcular timeTaken=final-inicio. Convertir a la PF segundos. El sueño(0.1-timeTaken). Vuelve atrás.

  3. 0

    intente esto:

    #!/usr/bin/python
    import time;  # This is required to include time module.
    from threading import Timer
    
    def hello(start, interval, count):
        ticks = time.time()
        t = Timer(interval - (ticks-start-count*interval), hello, [start, interval, count+1])
        t.start()
        print "Number of ticks since 12:00am, January 1, 1970:", ticks, " #", count 
    
    dt = 1.25 # interval in sec
    t = Timer(dt, hello, [round(time.time()), dt, 0]) # start over at full second, round only for testing here
    t.start()

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea