虽然我看到过类似的问题,但在 SO 上找到的答案都没有帮助我,但我希望有鹰眼的善良灵魂可以帮助我在这里查明问题。我知道这不是 goroutines 的最佳用途,但我想以这种方式作为练习,但显然失败了。我的代码package mainimport ( "fmt" "sort" "sync")func main() { X := []int{1, 2, 3, 4, 0} Y := []int{2, 3, 6, 8, 4} solution := Solution(X, Y) fmt.Println(solution)}//Solution solutionfunc Solution(X []int, Y []int) int { size := len(X) resultChan := make(chan int) results := make(map[int]int) ParseDivision(size, X, Y, resultChan) for val := range resultChan { results[val] = results[val] + 1 } close(resultChan) return FindGreatest(results)}//Divide dividefunc Divide(a int, b int, resultChan chan<- int, wg *sync.WaitGroup) { defer wg.Done() result := float64(a) / float64(b) resultChan <- int(result * 1000)}//FindGreatest find greatest in mapfunc FindGreatest(myMap map[int]int) int { values := make([]int, 0, len(myMap)) for _, val := range myMap { values = append(values, val) } sort.Ints(values) return values[len(values)-1]}//ParseDivision intfunc ParseDivision(lenth int, X []int, Y []int, resultChan chan<- int) { var wg sync.WaitGroup wg.Add(lenth) for i := 0; i < lenth; i++ { go Divide(X[i], Y[i], resultChan, &wg) } wg.Wait()}结果:fatal error: all goroutines are asleep - deadlock!我完全不确定为什么我已经遵循了一些示例以及 SO 的答案,关于通过引用传递 waitGroup 以及使用通道来获取在 goroutine 中执行的操作的结果。
1 回答
繁星淼淼
TA贡献1775条经验 获得超11个赞
需要注意的一些事项:
写入通道的 go-routine 通常应该关闭通道;
从上面开始,“阅读器” go-routine 应该等待通道关闭(通过范围等) - 即它永远不必关闭其读取的通道。
由于您的结果通道是无缓冲的(缓冲区大小为 0),主 go-routine 阻塞等待工作人员尝试写入,并且主要 go-routine 尚未(尚未)从结果通道读取(作为池管理器 go-必须完成例程才能发生这种情况 - 死锁!)。解决方案:
确保工作池 go-routine 独立于主(阅读器)go-routine 运行。
3 行修复: https: //play.golang.org/p/9hYuyDgMjGi
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消