栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果有时间,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个示例:

  • go
    启动新的goroutine 的语句发生在goroutine的执行开始之前。
  • 通道上的发送发生在该通道上的相应接收完成之前。

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

回到您的示例:

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

因此,您获得的唯一保证是,运行的goroutine

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

没有定义



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374632.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号