golang temps.Sommeil bug?
Je fais de test de code ci-dessous(gotest.allez)
package main
import (
"fmt"
"time"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go testa()
wg.Wait()
}
func testa() {
for {
fmt.Println("test goroutine")
time.Sleep(2 * time.Second)
}
}
console
go run gotest.go
et, changer mon ordinateur date de
(ex : 2015-07-30 -> 2015-07-29)
et puis,
println pas imprimé!!
est-ce un bug??
(Il est en train de mettre au jour suivant)
- Je utiliser MacOs dernière ver.
Je vous remercie.
Je n'ai pas un tel comportement de la machine windows. C'est peut-être un bug sur les machines unix, à cause par exemple à l'aide de temps comparaison dans le temps.Fonction de veille
OriginalL'auteur user2139281 | 2015-07-31
Vous devez vous connecter pour publier un commentaire.
Interne de sommeil se fait avec le temps absolu: si vous appelez
Sleep(n)
au momentT
le programme est prévu de ne pas se réveiller aprèsn
temps, mais à tempsT + n
.C'est généralement préférable, car:
temps ne s'écoule pas vers l'arrière
en raison d'OS de planification des retards d'un programme qui, à plusieurs reprises dort peuvent être en retard sur l'horaire indéfiniment; à l'aide de temps absolu rendre compenser les retards de la part de couchage pour des intervalles plus courts.
Dans votre cas, vous avez juste à attendre un jour pour le programme pour redémarrer l'impression. 😀
Ou de définir un temps juste un peu dans le passé (15 sec), et de voir le programme de la reprise après 15+2 sec.
PS. Afin de clarifier ce qui se passe avec un exemple:
À 2016-08-25 16:27:12 le programme appelle
time.Sleep(2 * time.Second)
L'Aller runtime horaires de la goroutine d'être réveillé sur 2016-08-25 à 16:27:14 et met le goroutine dormir
pendant ce temps ...
l'utilisateur définit l'heure du système 2016-08-24 16:27:13
maintenant le délai d'attente est sur le point d'expirer un jour et une seconde plus tard.
Cela ne devrait pas arriver sur les systèmes, sur qui utilise POSIX CLOCK_MONOTONIC ou équivalent.
Mais ce n'est pas vrai, ou puis-je raté quelque chose? Voici les docs pour
time.Sleep
: ( golang.org/pkg/time/#Sleep ) Sommeil suspend le courant goroutine pour au moins la durée d. Un négatif ou égal à zéro durée causes de Sommeil pour revenir immédiatementJ'ai vérifié et
time.Sleep(1 * time.Second)
en effet met mon goroutine dormir pendant 1 seconde.Ce la
time.Sleep
de l'interface; je l'ai dit interne l'interface est implémentée avec une absolue délai d'attente, voir golang.org/src/runtime/time.go#L54OriginalL'auteur chill