gpt4 book ai didi

concurrency - 如何退出 channel 范围/收集结果

转载 作者:IT王子 更新时间:2023-10-29 02:16:12 24 4
gpt4 key购买 nike

我需要同时处理多个任务,然后“收集”结果。下面是我想出的代码,但我想知道这是否是正确的方法(即惯用/最佳实践),或者是否有我可能会错过的错误。

package main

import "fmt"
import "sync"

func main() {
// ch is the int provider. Cap is 99 but it should
// really be 3
ch := make(chan int, 99)
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
ch <- i
}(i)
}
wg.Wait()
for v := range ch {
fmt.Println("consume ", v)
if len(ch) == 0 {
close(ch)
}
}
fmt.Printf("All done")
}

最佳答案

这没有什么错误 .. 它有效。但是,关闭 channel (而不是消费者)确实应该是生产者的工作。

为此..我建议您将整个生产者进程移动到一个 goroutine 中并等待..然后关闭 channel :

package main

import "fmt"
import "sync"

func main() {
ch := make(chan int, 3)
var wg sync.WaitGroup

go func() {
for i := 0; i < 3; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
ch <- i
}(i)
}
wg.Wait()
close(ch) // producer is now closing the channel
}()

// Consumer has the single responsibility of iterating over the channel
for v := range ch {
fmt.Println("consume ", v)
}
fmt.Printf("All done")
}

See it in the Go Playground

关于concurrency - 如何退出 channel 范围/收集结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29200625/

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