2011-01-15 17 views
3

Ich möchte jedes Mal, wenn ich es ausführe, ein Stück meines Codes in exakt der gleichen Zeit ausführen, ähnlich wie beim Abspielen einer Mediendatei ... (das gleiche Stück Code wird in genau der gleichen Menge ausgeführt) (Zeit jedes Mal)python zeitgesteuerte Ausführung von Code

Ist das in Python möglich?

+0

Welche Art von Timing Genauigkeitsanforderungen haben Sie? – thkala

+2

* Warum * muss es immer die gleiche Zeit sein? Soll es mit einem anderen Event synchronisiert werden? Es könnte möglich sein, sie direkt anstelle der Verzögerungszeit zu synchronisieren. –

Antwort

2

Dies sollte den Trick:

def run_with_delay(funcs, interval): 
    for f in funcs[:-1]: 
     before = time() 
     f() 
     # compensate the interval with the execution time. 
     # NB: careful for functions that have a greater 
     #  execution time than interval 
     after = time() 
     if after - before < interval: 
      sleep(interval - (after - before)) 
    # last function is taken separately because we don't need 
    # an extra useless sleep 
    funcs[-1]() 
+0

Wenn die Anwendung während der Ausführung von f() vom Betriebssystem unterbunden wird, werden Sie abgesprungen - es sei denn, Sie befinden sich in einem Echtzeitbetriebssystem. Es gibt keine Garantie, dass f() innerhalb eines begrenzten Zeitintervalls abgeschlossen wird. –

0

Ich denke, das wäre in einem Betriebssystem unmöglich, das Befehle verschachtelt, um die simultane Ausführung mehrerer Threads zu simulieren.

Sie benötigen eine Echtzeitbibliothek oder -sprache, um Deadlines für Ihren Code festzulegen, und selbst dann kann die Ausführung nicht in der zugewiesenen Zeit garantiert werden.

+0

Was ist dann bei Mediendateien der Fall, sie führen immer genau zur gleichen Zeit den gleichen Code aus? Und das kann mit jedem einfachen Programm gemacht werden, denke ich ... –

+0

Ein Lied ist eine Sammlung von Klängen, die auf einer bestimmten Frequenz gesampelt werden, so dass unsere Ohren es als eine konstante Melodie wahrnehmen. Das Ausführen von Code ist etwas, was Sie normalerweise schnell tun möchten, was Sie vielleicht anstreben, ist * ereignisbasiertes * Programmieren. –

1

Ich glaube nicht, dass dies durch ein Sprachkonstrukt (in jeder Sprache) garantiert werden kann - Sie müssten auf einem Echtzeitbetriebssystem sein. Ich glaube, dass Multimedia-Anwendungen die Pufferung auf Geräteebene nutzen, um Timing-Jitter im OS-Prozess-Scheduler zu kompensieren.

+0

Bitte erläutern Sie, was Sie in Ihrer letzten Zeile meinen. Auch wenn wir dies leicht mit Mediendateien erreichen können, dann sollte es möglich sein, dies möglicherweise für irgendeinen anderen Code zu erreichen ... –

+1

@Guanidene: Angenommen, Sie spielen eine Audiodatei mit einer Samplerate von 44,1 kHz. Die Anwendung wird durch einige Multimedia-APIs einen Stapel von Proben in etwas unregelmäßigen Intervallen anordnen, abhängig davon, wie sie vom Betriebssystem geplant werden. Das Ausgabegerät, nicht die Anwendung oder das Betriebssystem, ist dafür verantwortlich, sie mit der richtigen Rate abzuspielen. Sie sind also auf das Gerät angewiesen, um den zeitkritischen Teil der Aufgabe auszuführen, und dies kann nicht auf beliebigen Code verallgemeinert werden, der keine Echtzeit-Unterstützung auf Hardware-Ebene bietet. –

+0

Ok, ich verstehe es. Vielen Dank! –