第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

長時(shí)間運(yùn)行的 go 例程完成時(shí)發(fā)出信號(hào)

長時(shí)間運(yùn)行的 go 例程完成時(shí)發(fā)出信號(hào)

Go
開滿天機(jī) 2022-05-18 10:07:06
在這段代碼中,我有一個(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)


查看完整回答
反對(duì) 回復(fù) 2022-05-18
  • 1 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)