首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Goroutine和for循环

Goroutine和for循环
EN

Stack Overflow用户
提问于 2015-04-21 05:02:30
回答 1查看 2K关注 0票数 0

我所要做的就是将一个值发送到通道,然后从main()函数返回,并在从通道ch接收到一个值之后立即退出程序。

但这件事会永远持续下去:

代码语言:javascript
运行
复制
ch := make(chan int)

for {
    go func() {
        ch <- 1
    }()
}

<-ch

在从通道接收到一个值之后,如何使用这个for循环返回?

为什么这会永远持续下去?

去操场链接在这里

http://play.golang.org/p/EvmT6Pw96Y

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-21 05:16:11

由于for循环永远运行,您的代码将永远运行。在从未到达ch循环后从for接收。

如果您希望您的代码在某个时候退出,那么您必须在某个时候结束for循环,例如,让它只运行一定数量的迭代:

代码语言:javascript
运行
复制
for i := 0; i < 5; i++ {
    ...
}

因此,如果您只运行5次迭代(如我的示例),那么在执行来自chch循环后,如果其他goroutines尚未运行,则可能会阻塞(因为ch未被缓冲),并且至少将执行一个已启动的goroutines,该值将在通道上发送一个值,该值可能会触发主goroutine继续运行(因为它的阻塞操作不再是阻塞的)。

还要注意的是,Go Memory Model只保证某些事件发生在其他事件之前,您无法保证如何执行2个并发goroutines。您无法保证在for循环中启动的goroutines在从ch接收时被阻塞之前就会开始执行。

通常,当一个goroutine被阻塞时(例如阻塞通道接收操作),运行时可能会安排另一个goroutine运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29763309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档