Почему 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:
Мы фиксируем время каждой записи в стандартный вывод и стандартную ошибку и предоставляем его клиенту. Затем клиент может "воспроизвести" записи с правильным временем, так что вывод будет выглядеть так, как если бы программа выполнялась локально.