Goroutine 和 for 循环
Goroutine and for loop
我只想从 main()
函数发送一个值到通道和 return 并在我从通道 ch
收到一个值后立即退出程序.
但这会让 运行ning 永远:
ch := make(chan int)
for {
go func() {
ch <- 1
}()
}
<-ch
我从通道收到一个值后,如何return使用这个for
循环?
为什么这会 运行 永远?
Go playgroundlink来了
自从 for
循环 运行 永远存在,您的代码 运行 永远存在。从未到达 for
循环后从 ch
接收。
如果你想让你的代码在某个时候退出,你必须在某个时候结束 for
循环,例如使其 运行 仅迭代一定次数:
for i := 0; i < 5; i++ {
...
}
因此,如果您仅 运行 5 次迭代(如在我的示例中),在 for
循环从 ch
接收后将执行,这可能会阻塞(因为 ch
是无缓冲的)如果其他 goroutines 还没有 运行,并且至少有一个启动的 goroutines 将被执行,它在通道上发送一个值,这可能会触发主 goroutine 继续(因为它的阻塞操作不再阻塞)。
另请注意,Go Memory Model 仅保证某些事件先于其他事件发生,您无法保证 2 个并发 goroutine 的执行方式。您无法保证在 for
循环中启动的 goroutines 将在主 goroutine 在接收来自 ch
.
时被阻塞之前开始执行
通常当一个 goroutine 被阻塞时(例如阻塞通道接收操作),运行time 可能会调度另一个 goroutine 到 运行。
我只想从 main()
函数发送一个值到通道和 return 并在我从通道 ch
收到一个值后立即退出程序.
但这会让 运行ning 永远:
ch := make(chan int)
for {
go func() {
ch <- 1
}()
}
<-ch
我从通道收到一个值后,如何return使用这个for
循环?
为什么这会 运行 永远?
Go playgroundlink来了
自从 for
循环 运行 永远存在,您的代码 运行 永远存在。从未到达 for
循环后从 ch
接收。
如果你想让你的代码在某个时候退出,你必须在某个时候结束 for
循环,例如使其 运行 仅迭代一定次数:
for i := 0; i < 5; i++ {
...
}
因此,如果您仅 运行 5 次迭代(如在我的示例中),在 for
循环从 ch
接收后将执行,这可能会阻塞(因为 ch
是无缓冲的)如果其他 goroutines 还没有 运行,并且至少有一个启动的 goroutines 将被执行,它在通道上发送一个值,这可能会触发主 goroutine 继续(因为它的阻塞操作不再阻塞)。
另请注意,Go Memory Model 仅保证某些事件先于其他事件发生,您无法保证 2 个并发 goroutine 的执行方式。您无法保证在 for
循环中启动的 goroutines 将在主 goroutine 在接收来自 ch
.
通常当一个 goroutine 被阻塞时(例如阻塞通道接收操作),运行time 可能会调度另一个 goroutine 到 运行。