亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何等待 go-routines 完成?

如何等待 go-routines 完成?

Go
陪伴而非守候 2022-07-11 16:40:21
下面是場景:inputCh := g(abc) // return <- chan []stringslice := make([]map[string][]string, 0)m := sync.Mutex{}for whatever := range inputCh {    go func(whatever []string) {        matches := f(xyz, whatever) // returns map[string][]string        m.Lock()        slice = append(slice, matches)        m.Unlock()    }(whatever)}z := merge(slice...)我們不知道的地方,何時inputCh關閉(close(inputCh))merge(slice...)我們只需要在所有 go-routines 完成和更新后調用slice不確定,如果sync.WaitGroup可以使用。如何確保只有在所有 go-routines 更新merge(slice...)后才被調用?slice
查看完整描述

2 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

使用sync.WaitGroup并檢查通道何時關閉


var wg sync.WaitGroup


for {

    whatever, ok := <-inputCh

    if !ok { // check inputCh is close

        break

    }

    // add delta

    wg.Add(1)

    go func(whatever []string) {

        matches := f(xyz, whatever)

        m.Lock()

        slice = append(slice, matches)

        m.Unlock()

        // goroutine is done

        wg.Done()

    }(whatever)

}


// waits until all the goroutines call "wg.Done()"

wg.Wait()


查看完整回答
反對 回復 2022-07-11
?
呼如林

TA貢獻1798條經驗 獲得超3個贊

您可以使用sync.WaitGroup.


// create a work group

var wg sync.WaitGroup

// add delta

wg.Add(len(inputCh))


slice := make([]map[string][]string, 0)

m := sync.Mutex{}

for whatever := range inputCh {

    go func(whatever []string) {

        matches := f(xyz, whatever) // returns map[string][]string

        m.Lock()

        slice = append(slice, matches)

        m.Unlock()

        // signal work group that the routine is done

        wg.Done()

    }(whatever)

}

// waits until all the go routines call wg.Done()

wg.Wait()


查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號