Sto provando a utilizzare i numeri time.Timer
di Go per pianificare le attività che devono essere eseguite nell'ordine corretto con una precisione dell'ordine di mezzo millisecondo. Funziona perfettamente su OSX e su Linux, ma fallisce sempre su Windows.Timer ad alta risoluzione (precisione millisecondo) in Go on Windows
Il seguente codice illustra il problema. Imposta 5 timer, il primo a 1 ms, il secondo a 2 ms, ... e l'ultimo a 5 ms. Quando scatta un timer, viene stampato il suo numero. Su OSX e Linux, questo ovviamente ha prodotto "12345" come output, ma su Windows i numeri sono più o meno casuali (testati su Win 7 e 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
}
}
}
Penso che questo comportamento è dovuto alle modifiche apportate in Go 1.6 (https://golang.org/doc/go1.6#runtime, 4 ° comma), dove la precisione del timer di Windows è stato ridotto da 1 ms a 16 ms, anche se dovrebbe anche essersi verificato con intervalli più brevi (dell'ordine di 100 μs) prima.
Esiste un modo per reimpostare la precisione globale del timer di Windows su 1 ms o per accedere a un timer ad alta risoluzione che renderebbe funzionante l'esempio precedente?
Qual è il comportamento corrente in go1.7rc? Ci sono state più modifiche ai timer di Windows a causa delle loro prestazioni. Si consiglia di leggere i numerosi problemi relativi al timer di Windows in GH. – JimB
I timer sembrano avere una risoluzione maggiore con la versione beta corrente di Go 1.7. Grazie per l'aiuto. – m4r73n
Probabilmente è una buona idea aggiungerla come risposta e contrassegnarla come accettata se ne sei felice. Quindi le persone che cercano di rispondere a domande senza risposta possono saltare questo. – ijt