2015-07-31 12 views
5

Faccio il codice di prova di seguito (gotest.go)golang time. Insetto addormentato?

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 

e, cambiare del mio computer data (es: 2015/07/30 -> 2015/07/29)

e quindi, stampa non stampata !!

è un bug ??

(si sta lavorando per impostare il giorno successivo)

Io uso MacOs ultima ver. Grazie.

+0

Non ho un comportamento simile su Windows Machine. Forse si tratta di un bug su macchine Unix, ad esempio l'utilizzo di tempo di comparsion nel tempo. Funzione sleep – RoninDev

risposta

5

sonno Internamente è fatto con tempo assoluto: se si chiama Sleep(n) al momento T il programma è prevista non svegliare dopon tempo, ma al tempo T + n.

Questo è generalmente preferibile perché:

  • tempo normalmente non scorre all'indietro

  • causa OS pianificazione ritarda un programma che può ospitare ripetutamente possono restare ritardo indefinitamente; utilizzando il tempo assoluto, compensa i ritardi dormendo per intervalli più brevi.

Nel tuo caso, devi solo attendere un giorno che il programma riprenda a stampare. : D

Oppure impostare un tempo solo un po 'nel passato (diciamo 15 secondi) e vedere il programma riprendere dopo 15 + 2 sec.

PS. Per chiarire ciò che accade con un esempio:

Al 2016/08/25 16:27:12 il programma chiama time.Sleep(2 * time.Second) Gli orari di runtime andare il goroutine essere svegliati su 2016/08/25 a 16:27:14 e mette il goroutine dormire

nel frattempo ...

l'utente imposta l'ora di sistema per 2016-08- 16:27:13

ora il timeout è prossimo alla scadenza uno giorno e un secondo dopo.

Questo non dovrebbe accadere nei sistemi in cui Go utilizza POSIX CLOCK_MONOTONIC o equivalente.

+1

Grazie per il tuo commento! – user2139281

+0

Ma questo non è vero, o mi manca qualcosa? Ecco i documenti per 'time.Sleep': (https://golang.org/pkg/time/#Sleep) _Sleep mette in pausa la goroutine corrente per almeno la durata d. Una durata negativa o pari a zero causa il ritorno immediato di Sleep_ –

+0

Ho verificato e 'time.Sleep (1 * volta.Secondo) "In effetti mette la mia goroutine a dormire per 1 secondo. –