Почему time.Sleep не работает, если нет дальнейших операторов для выполнения? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь запустить приведенный ниже фрагмент кода

package main

import (
    "fmt"
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
    fmt.Println("Done")
}

Как и ожидалось, он ждет 6 секунд, печатает «done» и затем завершает работу

Но если я удаляюнапечатать оператор,

package main

import (
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
}

, он не ждет и сразу выходит.Почему?

Следовательно, посмотрите на код ниже

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)
    go count(6, c)
    time.Sleep(time.Millisecond*5000)
}

func count(num int, c chan int) {
    for i := 1; i <= num; i++ {
        fmt.Println(i)
        c <- i
        time.Sleep(time.Millisecond*2000)
    }
    close(c)
}

Здесь процедура count будет заблокирована при попытке отправить i на канал, когда там нет получателя, чтобы прочитать егои функция main немедленно завершается, хотя после нее есть оператор sleep.Но когда я удаляю оператор

c <- i

, процедура count получает счет до 3, так как функция main ожидает этих 5 секунд, как указано.

Что происходитздесь

1 Ответ

3 голосов
/ 24 сентября 2019

Запустите его локально, и он будет ждать.Вывод на игровой площадке Go кэшируется.Если нет вывода, это не заставит вас ждать 6 секунд ни за что.Если есть вывод, время вывода сохраняется.

Читать сообщение в блоге: Блог Go: На игровой площадке Go:

Мы фиксируемсинхронизация каждой записи в стандартный вывод и стандартную ошибку и предоставление ее клиенту.Затем клиент может «воспроизвести» записи с правильным временем, чтобы выходные данные выглядели так, как если бы программа работала локально.

...