您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如果有时间,Goroutine不会执行。包括睡眠

如果有时间,Goroutine不会执行。包括睡眠

main函数结束时,它的程序结束。它不等待其他goroutine完成。

引用Go语言规范:程序执行

程序执行首先初始化主程序包,然后调用函数main。当该函数调用返回时,程序退出。它不等待其他(非main)goroutine完成。

因此,只要您的main功能通过在通道上发送值成功完成,该程序就可能立即终止,而另一个goroutine才有机会将接收到的值打印到控制台。

如果要确保将值打印到控制台,则必须将其与从main函数退出的事件进行同步:

具有“完成”频道的示例(在Go Playground上尝试):

func my_func(c, done chan int) {
    fmt.Println(<-c)
    done <- 1
}

func main() {
    c := make(chan int)
    done := make(chan int)
    go my_func(c, done)

    time.Sleep(time.Second)
    c <- 3
    <-done
}

由于done也是一个未缓冲的通道,因此在main函数结束时从该通道接收数据必须等待该done通道上的值发送,这c是在接收到通道上发送的值并将其打印到控制台后发生的。

够程可能会或可能不会被并行执行 在同一时间 。同步可确保某些事件先于其他事件发生。那是您获得的唯一保证,也是您应该依靠的唯一东西。 发生以下 2个示例:

有关更多详细信息,请阅读

来自未缓冲通道的接收发生在该通道上的发送完成之前。

因此,您获得的唯一保证是,运行的goroutinemy_func()将从c发送的通道接收值main()。但是,一旦接收到该值,该main函数可以 继续执行,但是由于发送后没有更多的语句,因此它仅随程序一起结束。无论非main够程将有 时间机会 与打印fmt.Println()没有定义

Go 2022/1/1 18:16:53 有578人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶