Goroutine和工作组问题

时间:2017-07-08 12:42:13

标签: go synchronization goroutine

我试图组合打印一组大工作(" 1,2"," 3,4"," 5")有额外的工作("一个","两个","三个")并使用Goroutines和Workgroups这样做。

我期待以下输出(不完全按此顺序排列,但内部工作组应在外部工作组之前完成):

var items = []
db.allDocs({include_docs: true}, function(err, docs) {
                docs.rows.map((obj, id) => {
                    items.push(obj.doc)
                })
            })


 this.cacheditems = items

Go Playground Link:https://play.golang.org/p/Hvbcmw06WY

但是,当我运行我的代码时,我得到以下输出:

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!

正如您所看到的,大工作的第二部分(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! 2)以某种方式失去了#34;在goroutines里面。

此外,永远不会达到4消息,因为所有goroutine都会以某种方式睡着,即使每个Waitgroup都已经完成(尽管缺少的All Big Jobs are done!2部分可能有某些内容做它)。

我还注意到,由于某种原因,首先会打印4条消息(尽管我假设打印功能在追赶Goroutines方面遇到了麻烦)。

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

知道我可能做错了吗?

1 个答案:

答案 0 :(得分:1)

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