我所要做的就是将一个值发送到通道,然后从main()
函数返回,并在从通道ch
接收到一个值之后立即退出程序。
但这件事会永远持续下去:
ch := make(chan int)
for {
go func() {
ch <- 1
}()
}
<-ch
在从通道接收到一个值之后,如何使用这个for
循环返回?
为什么这会永远持续下去?
去操场链接在这里
http://play.golang.org/p/EvmT6Pw96Y
发布于 2015-04-21 05:16:11
由于for
循环永远运行,您的代码将永远运行。在从未到达ch
循环后从for
接收。
如果您希望您的代码在某个时候退出,那么您必须在某个时候结束for
循环,例如,让它只运行一定数量的迭代:
for i := 0; i < 5; i++ {
...
}
因此,如果您只运行5次迭代(如我的示例),那么在执行来自ch
的ch
循环后,如果其他goroutines尚未运行,则可能会阻塞(因为ch
未被缓冲),并且至少将执行一个已启动的goroutines,该值将在通道上发送一个值,该值可能会触发主goroutine继续运行(因为它的阻塞操作不再是阻塞的)。
还要注意的是,Go Memory Model只保证某些事件发生在其他事件之前,您无法保证如何执行2个并发goroutines。您无法保证在for
循环中启动的goroutines在从ch
接收时被阻塞之前就会开始执行。
通常,当一个goroutine被阻塞时(例如阻塞通道接收操作),运行时可能会安排另一个goroutine运行。
https://stackoverflow.com/questions/29763309
复制相似问题