gpt4 book ai didi

go - 处理具有一个 "return"值的 goroutine 的惯用方式?

转载 作者:行者123 更新时间:2023-12-01 22:43:07 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




想象一下,我想编写一个返回随机数除以 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)
}

我看到这种方法存在一些问题。例如,我要求调用者在 channel 完成生成后关闭 channel ,从而可能有人调用该函数并无限期地保持 channel 打开。我的理解是,您总是希望发件人关闭 channel 。 A)这是真的吗,b)在这种情况下甚至可能吗?有没有更好的方法来编写此代码或解决此问题?

而且,一般来说,是否有更好的惯用方法来并行运行只向 channel 写入 1(或已知 N)值的函数?

谢谢。

最佳答案

您不需要关闭 channel 。一旦超出范围,它将被垃圾收集。关闭 channel 通常用于发送 done通知听众。所以在你的情况下甚至不可能。

您的方法是您要实现的目标的惯用方法,但不是唯一的方法。我能想到的其他一些(不一定是惯用的)是:

  • 您可以使用共享数据结构并通过显式同步从多个 goroutine 中填充它,
  • 您可以为每个 goroutine 保留一个单独的结果,并传入一个指向它的指针。每个 goroutine 设置它的结果而不需要同步,当一切都完成后,调用者处理结果。
  • 关于go - 处理具有一个 "return"值的 goroutine 的惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525071/

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