gpt4 book ai didi

Go routine with channel 死锁

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:12 26 4
gpt4 key购买 nike

我刚开始学习 Go,所以请耐心等待,我尝试使用 Go 例程和 channel ,但不知何故遇到了僵局。

举个例子

package main

import (
"fmt"
"sync"
)


func main() {
total := 2
var wg sync.WaitGroup
wg.Add(total)

ch := make(chan int)

for idx := 0; idx < total; idx++ {
fmt.Printf("Processing idx %d\n", idx)

go func(idx int) {
defer wg.Done()
ch <- idx
}(idx)
}

for val := range ch {
fmt.Println(val)
}

fmt.Println("Wait")
wg.Wait()
}

抛出错误

Processing idx 0
Processing idx 1
1
0
fatal error: all goroutines are asleep - deadlock!

最佳答案

range ch 从 channel 读取直到它关闭。

你调用了多少次close(ch)for val := range ch 循环何时终止?


什么时候应该关闭 channel ?您在这里有很多选择,但一种方法是添加另一个 goroutine:

go func() {
wg.Wait()
close(ch)
}()

例如,在分离所有将写入 channel 然后调用wg.Done() 的例程之后,以便在所有编写器完成写入后关闭 channel 。 (您可以在增加 wg 计数以说明所有作者后立即运行此 goroutine。)

关于Go routine with channel 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57916241/

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