在這段代碼中,我有一個(gè)循環(huán),它將一直運(yùn)行到經(jīng)過一定的時(shí)間。在此期間,我將隨機(jī)數(shù)量的數(shù)字發(fā)送到一個(gè)通道,以由運(yùn)行時(shí)間更長的 go 例程處理。問題是 goroutines 仍然需要完成某種任務(wù)(在這個(gè)例子中只是休眠)。如何確保發(fā)送到numbers通道的所有項(xiàng)目都已完成運(yùn)行并且messages已讀取發(fā)送到通道的所有項(xiàng)目?當(dāng)我運(yùn)行代碼時(shí),我看到 66 個(gè)數(shù)字應(yīng)該已經(jīng)運(yùn)行并被讀取。但輸出僅顯示 66 個(gè)中的 6 個(gè)已運(yùn)行然后讀出。0s10ms20ms30ms40ms50ms60ms70ms80ms90msRan 3Ran 5Ran 1Ran 0100msRan 4Ran 2110msDONE 66package mainimport ( "fmt" "math/rand" "time")func DoStuff(n int, messages chan string) { time.Sleep(time.Duration(100) * time.Millisecond) messages <- fmt.Sprintf("Ran %d", n)}func Read(messages chan string) { for m := range messages { fmt.Println(m) }}func Run(numbers chan int, messages chan string) { for n := range numbers { go DoStuff(n, messages) } }func main() { var min = 1 var max = 10 var numbers = make(chan int) var messages = make(chan string) go Read(messages) go Run(numbers, messages) var n = 0 for start := time.Now(); ; { elapsedTime := time.Since(start) fmt.Println(elapsedTime) if elapsedTime > time.Duration(100) * time.Millisecond { break } var random = rand.Intn(max - min) + min for i := 0; i < random; i++ { n++ numbers <- i } time.Sleep(time.Duration(10) * time.Millisecond) } fmt.Println("DONE", n)}
1 回答

素胚勾勒不出你
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用等待組。由于numbers代表傳入的工作,當(dāng)您向 發(fā)送內(nèi)容時(shí)numbers,您可以在等待組中添加一個(gè):
wg.Add(1)
numbers <- i
當(dāng)您閱讀消息時(shí),將該工作標(biāo)記為已完成:
func Read(messages chan string, wg *sync.WaitGroup) {
for m := range messages {
wg.Done()
fmt.Println(m)
}
}
并且,等待等待組在 main 中完成:
wg.Wait()
fmt.Println("DONE", n)
聲明可以傳遞給 goroutine 的等待組:
wg:=sync.WaitGroup{}
go Read(messages,&wg)
- 1 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)
0/150
提交
取消