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

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

戈朗通道缺少一些值

戈朗通道缺少一些值

Go
搖曳的薔薇 2022-08-24 15:47:01
我有以下代碼package mainimport (    "fmt"    "math/rand"    "time")func main() {    concurrent := 12    ch := make(chan int)    defer close(ch)    for i := 1; i <= concurrent; i++ {        go worker(i, ch)    }    for i := 1; i <= 21; i++ {        ch <- i    }}func worker(worker int, ch chan int) {    for requestId := range ch {        fmt.Printf("worker %d is requesting to %d...\n", worker, requestId)        time.Sleep(time.Duration(rand.Intn(3)) * time.Second)    }}該函數(shù)啟動(dòng)運(yùn)行該函數(shù)的多個(gè) goroutine,然后將一些值放入通道中,這些值由 worker 打印。我的問題是,有時(shí)通道中的最后一個(gè)值甚至更多值不是由工作人員打印的。mainworkerworker 10 is requesting to 10...worker 5 is requesting to 1...worker 5 is requesting to 13...worker 7 is requesting to 6...worker 2 is requesting to 2...worker 3 is requesting to 7...worker 3 is requesting to 14...worker 6 is requesting to 4...worker 11 is requesting to 9...worker 9 is requesting to 8...worker 9 is requesting to 15...worker 12 is requesting to 11...worker 8 is requesting to 12...worker 8 is requesting to 16...worker 4 is requesting to 5...worker 1 is requesting to 3...worker 11 is requesting to 17...我認(rèn)為這是因?yàn)橹饕δ茉诖蛴∽詈笠粋€(gè)值之前結(jié)束并“殺死”所有運(yùn)行g(shù)oroutine,因?yàn)樽詈笏兄刀际冀K被打印出來。func main() {    concurrent := 12    ch := make(chan int)    defer close(ch)    for i := 1; i <= concurrent; i++ {        go worker(i, ch)    }    for i := 1; i <= 21; i++ {        ch <- i    }    time.Sleep(3 * time.Second)}如何在不使用睡眠的情況下解決此問題,并且如果可能的話僅使用通道?
查看完整描述

1 回答

?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

因?yàn)橹?goroutine 在最后一個(gè)循環(huán)之后立即退出,導(dǎo)致整個(gè)程序也退出,所以后臺(tái) goroutines 可能會(huì)也可能不會(huì)有機(jī)會(huì)運(yùn)行,你必須提供一些同步方法來“等待”所有工作線程完成。for


用sync.WaitGroup


   func main() {


    concurrent := 12

    ch := make(chan int)


    var wg sync.WaitGroup

    for i := 1; i <= concurrent; i++ {

        wg.Add(1)

        go func(i int) {

            defer wg.Done()

            worker(i, ch)

        }(i) // You have to pass i as parameter

    }

    for i := 1; i <= 21; i++ {

        ch <- i

    }

    close(ch) // Close channel to tell all workers to stop


    wg.Wait() // Wait all workers to finish its work

   }


查看完整回答
反對 回復(fù) 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 92 瀏覽

添加回答

舉報(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)