gpt4 book ai didi

concurrency - 如何在没有死锁的情况下在缓冲 channel 上循环?

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

我想知道如何排出/关闭缓冲 channel ,以免陷入僵局?我正在使用 range 循环遍历 channel ,但似乎尽管它们被“读取”,但它们并没有像非缓冲 channel 那样关闭。

package main

func main() {

cp := 2
ch := make(chan string, cp)

for i := 0; i < cp; i++ {
go send(ch)
}
go send(ch)

for lc := range ch {
print(lc)

}

}

func send(ch chan string) {

ch <- "hello\n"

}

Play

最佳答案

您可以使用 close() builtin 关闭 channel .这必须在您的所有并发处理完成后调用。你如何做取决于你想做什么。

在您当前的架构中,您似乎必须建立一个全局状态,它可以跟踪您的所有流程并确定最后一个流程是否已完成。这种状态可以通过使用 sync.WaitGroup 来实现。例如。

func send(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
// ...
}

wg := &sync.WaitGroup{}

for i := 0; i < cp; i++ {
wg.Add(1)
go send(ch, wg)
}
wg.Add(1)
go send(ch, wg)

wg.Wait()
close(ch)

for e := range(ch) {
// ...
}

请注意,关闭 channel 然后对其进行迭代将给您仅 channel 中排队的元素。这意味着任何想要在 channel 中放入值的 goroutine 都不能再这样做,因为 channel 已关闭。

关于concurrency - 如何在没有死锁的情况下在缓冲 channel 上循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23022200/

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