【发布时间】:2020-02-19 19:57:50
【问题描述】:
假设我想编写一个返回随机数除以 2 的函数:
func randomIntInHalf() int {
return rand.Int() / 2
}
但后来我决定要为并发构建这个函数,所以我最终得到:
func randomIntInHalf(c chan<- int) {
c <- rand.Int() / 2
}
func main() {
// Generate 10 random ints in parallel
amount := 10
c := make(chan int, amount)
for i := 0; i < amount; i++ {
go randomIntInHalf(c)
}
for i := 0; i < amount; i++ {
fmt.Println(<-c)
}
close(c)
}
我发现这种方法存在一些问题。例如,我要求调用者在通道完成生成后关闭通道,这使得有人可能会调用该函数并使通道无限期地保持打开状态。我的理解是,您总是希望发件人关闭频道。 A)这是真的吗,b)在这种情况下甚至可能吗?有没有更好的方法来编写这段代码或解决这个问题?
而且,一般来说,有没有更好的惯用方法来并行运行只向通道写入 1(或已知 N)值的函数?
谢谢。
【问题讨论】:
-
A) No. B) 写一个普通函数。如果您坚持通过渠道传递价值,那么您的方法很好,因为 A。如果您不在渠道范围内,则没有真正需要关闭它。