gpt4 book ai didi

concurrency - Goroutine 和 for 循环

转载 作者:IT王子 更新时间:2023-10-29 02:34:07 25 4
gpt4 key购买 nike

我想做的就是向 channel 发送一个值,然后从 main() 函数返回,并在从 channel ch .

但这会一直运行下Go:

ch := make(chan int)

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

<-ch

从 channel 接收到一个值后,如何使用此 for 循环返回?

为什么它会永远运行?

Go playground 链接在这里

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

最佳答案

因为 for 循环永远运行,你的代码永远运行。从未到达 for 循环后从 ch 接收。

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

for i := 0; i < 5; i++ {
...
}

因此,如果您只运行 5 次迭代(如在我的示例中),则在 for 循环从 ch 接收之后将执行,这可能会阻塞(因为 ch 是无缓冲的)如果其他 goroutines 还没有运行,并且至少有一个启动的 goroutines 将被执行,它在 channel 上发送一个值,这可能会触发主 goroutine 继续(因为它的阻塞操作不再阻塞).

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

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

关于concurrency - Goroutine 和 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29763309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com