Почему time.Sleep не работает, если больше нет операторов для выполнения?

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

package main

import (
    "fmt"
    "time"
)

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

Как и следовало ожидать, он ждет 6 секунд, печатает "готово" и затем выходит.

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

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 goroutine будет заблокирован при попытке отправить i на канал, когда нет получателя, который мог бы его прочитать, а main функция немедленно завершает работу, даже если есть sleepзаявление после него. Но когда я удаляю заявление

c <- i

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

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

1 ответ

Решение

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

Прочтите сообщение в блоге: The Go Blog: Inside the Go Playground:

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

Другие вопросы по тегам