登录
首页 >  Golang >  Go问答

为什么在未执行其他操作时 time.Sleep 不生效?

来源:stackoverflow

时间:2024-02-24 11:27:24 101浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《为什么在未执行其他操作时 time.Sleep 不生效?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在尝试运行下面的代码

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 goroutine 时,尝试将 i 发送到通道时将被阻止,并且 main 函数立即退出,即使后面有 sleep 语句。但是当我删除该语句时

c <- i

count goroutine 会一直计数到 3,因为 main 函数确实会按照规定等待 5 秒。

这是怎么回事?


解决方案


在本地运行它,它会等待。 Go 演示上的输出被缓存。如果没有输出,也不会让你白等6秒。如果有输出,则保留输出的时序。

阅读博文:The Go Blog: Inside the Go Playground:

我们捕获每次写入标准输出和标准错误的时间并将其提供给客户端。然后客户端可以以正确的时间“回放”写入,以便输出就像程序在本地运行一样。

到这里,我们也就讲完了《为什么在未执行其他操作时 time.Sleep 不生效?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>