2016-06-08 8 views
5

Ich versuche Go's time.Timer s zu verwenden, um Aufgaben zu planen, die in der richtigen Reihenfolge mit einer Genauigkeit in der Größenordnung von einer halben Millisekunde ausgeführt werden müssen. Dies funktioniert unter OSX und Linux einwandfrei, aber jedes Mal unter Windows.Hochauflösende Timer (Millisekundengenauigkeit) in Go unter Windows

Der folgende Code veranschaulicht das Problem. Es setzt 5 Timer, der erste bis 1 ms, der zweite bis 2 ms, ... und der letzte bis 5 ms. Sobald ein Timer ausgelöst wird, wird seine Nummer gedruckt. Unter OSX und Linux erzeugte dies offensichtlich "12345" als Ausgabe, aber unter Windows sind die Zahlen mehr oder weniger zufällig (getestet auf Win 7 und Windows Server 2012).

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    var timer1, timer2, timer3, timer4, timer5 *time.Timer 

    timer1 = time.NewTimer(1 * time.Millisecond) 
    timer2 = time.NewTimer(2 * time.Millisecond) 
    timer3 = time.NewTimer(3 * time.Millisecond) 
    timer4 = time.NewTimer(4 * time.Millisecond) 
    timer5 = time.NewTimer(5 * time.Millisecond) 

    // should print 12345 
    for { 
     select { 
     case <-timer1.C: 
      fmt.Print("1") 
     case <-timer2.C: 
      fmt.Print("2") 
     case <-timer3.C: 
      fmt.Print("3") 
     case <-timer4.C: 
      fmt.Print("4") 
     case <-timer5.C: 
      fmt.Print("5") 
     case <-time.After(200 * time.Millisecond): 
      return // exit the program 
     } 
    } 
} 

Ich denke, dieses Verhalten zu den Änderungen in Go gebührt 1,6 (https://golang.org/doc/go1.6#runtime, 4. Absatz), in dem die Windows-Timer Genauigkeit von 1 ms bis 16 ms reduziert wurde, obwohl es auch in kürzeren Abständen stattgefunden haben sollte (in der Größenordnung von 100 μs) vorher.

Gibt es eine Möglichkeit, die globale Windows-Timer-Genauigkeit auf 1 ms zurückzusetzen oder auf einen hochauflösenden Timer zuzugreifen, der das obige Beispiel funktionieren lässt?

+3

Wie ist das aktuelle Verhalten in der go1.7rc? Die Windows-Timer haben aufgrund ihrer Leistung mehr Änderungen erfahren. Vielleicht möchten Sie durch die vielen Windows-Timer Probleme in GH lesen. – JimB

+0

Timer scheinen eine höhere Auflösung mit dem aktuellen Beta von Go 1.7 zu haben. Danke für Ihre Hilfe. – m4r73n

+1

Es ist wahrscheinlich eine gute Idee, das als Antwort hinzuzufügen und es als akzeptiert zu markieren, wenn Sie damit zufrieden sind. Dann können Leute, die unbeantwortete Fragen beantworten möchten, dies überspringen. – ijt

Antwort

0

Seit Go 1.7 haben Timer jetzt eine höhere Auflösung und dieses Problem sollte nicht auftreten.