2015-07-31 8 views
5

robię kodu testu poniżej (gotest.go)czas golang. Błąd spoczynku?

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) 
    } 
} 

konsoli

go run gotest.go 

i zmienić mój komputer datą (ex: 30.07.2015 -> 29.07.2015)

a następnie, wydruk nie został wydrukowany !!

czy to błąd?

(on pracuje, aby ustawić następny dzień)

używam MacOS najnowszą ver. Dziękuję.

+0

Nie mam takiego zachowania na komputerze z systemem Windows. Może to błąd na maszynach unixowych, na przykład używanie kompilacji czasu w czasie. Funkcja spoczynku – RoninDev

Odpowiedz

5

Wewnętrznie sen odbywa się bezwzględną czasu: jeśli zadzwonisz Sleep(n) w czasie T program jest zaplanowane, aby nie obudzić pon czasu, ale na czasie T + n.

ogół jest to korzystne, ponieważ:

  • czas zwykle nie płynie wstecz

  • powodu OS harmonogramu opóźnia program, który wielokrotnie śpi z pewnym opóźnieniem harmonogramu na czas nieokreślony; użycie czasu bezwzględnego powoduje, że kompensuje opóźnienia przez spanie w krótszych odstępach czasu.

W twoim przypadku wystarczy zaczekać jeden dzień, aby program ponownie rozpoczął drukowanie. : D

Lub ustaw trochę czasu w przeszłości (powiedzmy 15 sekund) i zobacz, jak program wznawia się po 15 + 2 sek.

PS. Aby wyjaśnić, co się dzieje na przykładzie:

Na 2016-08-25 16:27:12 program wywołuje time.Sleep(2 * time.Second) Przeważnie uruchomieniowe iść goroutine być budzony w dniu 2016-08-25 16:27:14 i stawia goroutine spać

tymczasem ...

użytkownik ustawia czas systemowy do 2016-08- 16:27:13

teraz timeout wygasnąć jeden dzień i sekundę później.

To nie powinno się zdarzyć w systemach, na których Go używa POSIX CLOCK_MONOTONIC lub jego odpowiednik.

+1

Dziękujemy za komentarz! – user2139281

+0

Ale to nie jest prawda, czy coś mi brakuje? Oto dokumenty dla 'time.Sleep': (https://golang.org/pkg/time/#Sleep) _Sleep zatrzymuje bieżącą goroutine przez co najmniej czas trwania d. Negatywny lub zerowy czas trwania powoduje, że Sleep zwraca się natychmiast_ –

+0

Sprawdziłem i 'time.Sleep (1 * time.Po drugie) "rzeczywiście uśpiono moją glistę na 1 sekundę. –