gpt4 book ai didi

multithreading - 我怎样才能拥有一个等待来自多个其他人的值的 goroutine 函数?

转载 作者:行者123 更新时间:2023-12-01 22:34:45 25 4
gpt4 key购买 nike

我创建了一个 Go playground sample这说明了我在说什么。

在示例中,我创建了一个 goroutine,func2,我只想通过它的 channel 等待输入,并在它到达后打印值。

func func2(ch chan int) {
fmt.Println("func2")
v:=<-ch
fmt.Println(v)
}

然后,在一个循环中,我为另一个函数创建 goroutine,这些是 WaitGroup 的一部分。
func func1(ch chan int, wg *sync.WaitGroup) {
fmt.Println("func1")
ch <- 11032
wg.Done()
}

总的来说,我等待 WaitGroup。我遇到了僵局,我不知道如何解决它。很清楚我想要实现的目标,我希望 func2 在我调用它后作为线程保持打开状态,以处理 n 个值,其中 n 是我为 func1 调用的 goroutine 的数量。我考虑在 func2 内部使用 WaitGroup Wait,但我不希望它阻塞,因为它需要在 func1 发送时处理新数据。

最佳答案

我认为您遇到了僵局,因为您的 func2仅消耗 1 来自 ch 的值然后整理。然后其他func1 goroutine 卡在等待 ch可以写入,他们不能这样做,因为没有其他 goroutine 可以从 ch 读取在另一端。

既然你想要func2持续使用 ch 中的值直到 ch已关闭,您需要在 func2 中创建一个循环像这样:

func func2(ch chan int) {
fmt.Println("func2")
for v := range ch {
fmt.Println(v)
}
}

这将保留 func2 “活着”并从 ch 阅读直到你做 close(ch)别的地方。合适的地方关闭 ch在您的示例中可能位于 mainwg.Wait() 之后.

如果您想确保看到所有 Println 的结果程序结束前的语句,你还应该使用一些同步机制来等待 func2完成。否则 main将在 close(ch) 之后立即结束可能在 func2 之前,也可能不在打印了它收到的每个值。

一种常见的技术是“完成” channel 。例如:
func func2(ch chan int, done chan bool) {
fmt.Println("func2")
for v := range ch {
fmt.Println(v)
}
done <- true
}

main :
done := make(chan bool)
go func2(ch, done)
...
wg.Wait()
close(ch)
<-done

使用 chan struct{} (empty struct) 也很常见,因为空结构不需要内存。

关于multithreading - 我怎样才能拥有一个等待来自多个其他人的值的 goroutine 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60252397/

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