2015-07-31 4 views
5

Je fais code de test ci-dessous (gotest.go)temps golang.Bugs sommeil?

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 ma date de l'ordinateur (ex: 30/07/2015 -> 29/07/2015)

puis, ne s'imprime pas !!

est-il bug?

(Il travaille pour régler le jour suivant)

J'utilise MacOs dernière ver. Merci.

+0

Je n'ai pas un tel comportement sur Windows machine. Peut-être que c'est un bug sur les machines Unix, cause par exemple de l'utilisation de la notion de temps dans le temps. Fonction Sommeil – RoninDev

Répondre

5

sommeil interne se fait avec le temps absolu: si vous appelez Sleep(n) au moment T le programme devrait pas se réveiller après n temps, mais à temps T + n.

Ceci est généralement préférable car:

  • le temps ne coule pas habituellement en arrière

  • en raison de la programmation OS retarde un programme qui dort de façon répétée indéfiniment retard peut en retard; en utilisant le temps absolu, il compense les retards en dormant pour des intervalles plus courts.

Dans votre cas, il vous suffit d'attendre une journée avant que le programme ne recommence à imprimer. : D

Vous pouvez aussi régler un temps juste un peu dans le passé (disons 15 sec), et voir le programme reprendre après 15 + 2 sec.

PS. Pour clarifier ce qui se passe avec un exemple:

Au 25/08/2016 16:27:12 le programme appelle time.Sleep(2 * time.Second) Les horaires d'exécution Go le goroutine être réveillé sur 25/08/2016 à 16:27:14 et met le goroutine dormir

quant à lui ...

l'utilisateur définit le temps de système 2016-08- 16:27:13

maintenant le délai d'attente est prévue pour expirer une jours et une seconde plus tard.

Cela ne devrait pas se produire sur les systèmes sur lesquels Go utilise POSIX CLOCK_MONOTONIC ou un équivalent.

+1

Merci pour votre commentaire! – user2139281

+0

Mais ce n'est pas vrai, ou est-ce que quelque chose me manque? Voici les documents pour 'time.Sleep': (https://golang.org/pkg/time/#Sleep) _Sleep met en pause le goroutine courant pendant au moins la durée d. Une durée négative ou nulle entraîne le retour immédiat du sommeil. –

+0

J'ai vérifié et 'time.Sleep (1 * time.Deuxièmement) 'met mon goroutine en sommeil pendant 1 seconde. –