我试图组合打印一组大工作(" 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
知道我可能做错了吗?
答案 0 :(得分:1)
jobWG.Wait()
位于for _, job := range jobs
循环内部,当它应该在外面时。
这是一个固定版本https://play.golang.org/p/KNLS0y8xLg