我想使用并發(fā)模型來編寫一個函數(shù),以防輸入太大而并行處理會更有效,但是它永遠(yuǎn)不會結(jié)束。假設(shè)有一個struct定義為:type Tree struct { Name string `json:"name"` SubTrees []*Tree `json:"subTrees,omitempty"` Leaves []string `json:"leaves"`}我想寫一個函數(shù)來計算Leaves整個遞歸結(jié)構(gòu)的總數(shù)。這很容易通過以下方式進(jìn)行遞歸:func (tree *Tree) CountLeaves() int { curr := len(tree.Leaves) for _, s := range tree.SubTrees { curr += s.CountLeaves() } return curr}很好,一切都很好,但是如果結(jié)構(gòu)太大,效率將會很低,所以我想將其重構(gòu)為并發(fā)并使用通道。這是我嘗試進(jìn)行重構(gòu)的嘗試:func (tree *Tree) CountLeaves() int { var wg sync.WaitGroup ch := make(chan int) defer close(ch) go count(tree, true, ch, &wg) var total int wg.Add(1) go func(total *int) { for x := range ch { fmt.Println(x) *total += x } wg.Done() }(&total) wg.Wait() return total}func count(t *Tree, root bool, ch chan int, wg *sync.WaitGroup) { defer wg.Done() ch <- len(t.Leaves) if t.SubTrees != nil { wg.Add(len(t.SubTrees)) for _, s := range t.SubTrees { go count(s, false, ch, wg) } wg.Wait() } if root { ch <- -1 }}目前,我可以通過計算當(dāng)前總數(shù)所需的通道收集所有數(shù)字,Leaves但函數(shù)永無止境。-1來自根Tree結(jié)構(gòu)的終止值永遠(yuǎn)不會通過通道推送或接收,我也不知道為什么。有任何想法嗎?
- 1 回答
- 0 關(guān)注
- 275 瀏覽
添加回答
舉報
0/150
提交
取消