gpt4 book ai didi

去等待 goroutines 但同时做一些事情

转载 作者:IT王子 更新时间:2023-10-29 01:26:47 25 4
gpt4 key购买 nike

我有以下代码:

func execTask(input int, results chan<- int) {
//do stuff (in my case, start process and return something)
results <- someResult
}

func main() {
results := make(chan int)

for _, task := range tasks {
go execTask(task, results)
}

for result := range results {
fmt.Println(result)
}
}

对于行 for result := range results { 我得到一个错误: fatal error :所有 goroutines 都睡着了 - 死锁!。在例程execTask中我其实是用os/exec执行了一个进程,所以不知道results中有多少个结果。所以我必须等待我所有的过程完成,但与此同时对结果做一些事情。当所有进程终止时,我的 go-Programm 也可能终止。

我该怎么做?

谢谢,拉斯

最佳答案

您遇到死锁错误是因为您没有关闭 results channel 。因此,main 继续等待有关results 的更多数据,即使在所有 execTask 都已完成之后,也没有其他内容写入 结果

您可以使用 sync.WaitGroup 解决此问题:

func main() {
var wg sync.WaitGroup
results := make(chan int)

wg.Add(len(tasks))
for _, task := range tasks {
go func(task int) {
defer wg.Done()
execTask(task, results)
}(task)
}

go func() {
wg.Wait() // wait for each execTask to return
close(results) // then close the results channel
}

for result := range results {
fmt.Println(result)
}
}

至于在其他进程仍在执行时处理 execTask 结果,您已经有了正确的想法。只需在 results 范围循环中处理它们。如果您想要更多并发执行,请在其中启动更多 goroutine。

关于去等待 goroutines 但同时做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893439/

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