我正在尝试打印一组Big Jobs(“1,2”,“3,4”,“5”)和Extra Jobs(“一个”,“两个”,“三个”),并使用Goroutines和工作组可以这样做。

我期望得到以下输出(不完全按此顺序,但是内部工作组应先于外部工作组完成):

Big Job being done: 1,2
1_one
1_two
1_three
2_one
2_two
2_three
Big Job 1,2 is Done!
Big Job being done: 3,4
3_one
3_two
3_three
4_one
4_two
4_three
Big Job 3,4 is Done!
Big Job being done: 5
5_one
5_two
5_three
Big Job 5 is Done!
All Big Jobs are done!

前往Playground链接:https://play.golang.org/p/Hvbcmw06WY

但是,当我运行代码时,将获得以下输出:
Big job  1,2  is Done!
Big job  3,4  is Done!
Big job  5  is Done!
Big Job being done: 5
5_three
Big Job being done: 1,2
1_three
Big Job being done: 3,4
3_three
5_one
5_two
1_one
1_two
3_one
3_two
fatal error: all goroutines are asleep - deadlock!

如您所见,Big Jobs的第二部分(24)以某种方式“丢失”在goroutine中。

另外,由于每个goroutine都以某种方式入睡,因此即使每个Waitgroup应该已经完成​​,也永远不会到达All Big Jobs are done!消息(尽管丢失的24部分可能与此有关)。

我还注意到由于某种原因,首先打印了Done消息(尽管我假设Print函数根本无法赶上Goroutines)。

这是我要完成的非Goroutine版本:https://play.golang.org/p/zZpfyIbbn8

知道我做错了什么吗?

最佳答案

jobWG.Wait()应该位于for _, job := range jobs循环内时,应位于外部。
这是固定版本https://play.golang.org/p/KNLS0y8xLg

关于go - Goroutine和工作组问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44986340/

10-10 17:01