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

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

goroutine 從具有動(dòng)態(tài)循環(huán)的通道讀取等待組,在上一個(gè)返回之前重用

goroutine 從具有動(dòng)態(tài)循環(huán)的通道讀取等待組,在上一個(gè)返回之前重用

Go
qq_花開花謝_0 2023-07-04 16:51:06
我正在開發(fā)一個(gè)小型實(shí)用程序,它需要迭代動(dòng)態(tài)范圍的項(xiàng)目(可以是 100 或可以是 100000)并將這些項(xiàng)目放入通道中。另一個(gè)函數(shù)從該通道讀取項(xiàng)目并單獨(dú)對(duì)每個(gè)項(xiàng)目進(jìn)行一些處理。我試圖用來sync.WaitGroup確保在處理通道中的所有項(xiàng)目之前我的實(shí)用程序不會(huì)退出。由于我對(duì)頻道和等待組相當(dāng)陌生,因此我遇到了錯(cuò)誤panic: sync: WaitGroup is reused before previous Wait has returnedhttps://play.golang.org/p/nMw3END_9qwpackage mainimport (    "fmt"    "github.com/dchest/uniuri"    "math/rand"    "sync"    "time")var wg sync.WaitGroupvar count = 0func printMe(msg string) {    time.Sleep(1 * time.Second)    fmt.Println(count, msg)}func makeMePrint(ch chan string) {    for s := range ch {        count++        wg.Add(1)        printMe(s)        wg.Done()    }}func writePrint(ch chan<- string) {    fmt.Println("Starting to insert data in channel")    for i := 1; i <= rand.Intn(30); i++ {        s := uniuri.New()        ch <- s    }    fmt.Println("We are done inserting all data in the channel")    close(ch)}func main() {    var ch = make(chan string)    go writePrint(ch)    go makeMePrint(ch)    time.Sleep(1 * time.Second)    wg.Wait()}這是我正在研究的主要思想(不是確切的代碼,而是具有相同數(shù)量功能的完全相同的架構(gòu))。如何確保該實(shí)用程序僅在通道中的所有項(xiàng)目都是進(jìn)程時(shí)才退出。任何幫助表示贊賞。
查看完整描述

1 回答

?
富國(guó)滬深

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

我終于讓它發(fā)揮作用了。


package main


import (

    "fmt"

    "github.com/dchest/uniuri"

    "math/rand"

    "sync"

    "time"

)


var count = 0


func printMe(msg string) {

    time.Sleep(1 * time.Second)

    fmt.Println(count, msg)

}


func makeMePrint(wg *sync.WaitGroup, ch chan string) {

    wg.Add(1)

    defer wg.Done()


    for s := range ch {

        count++

        printMe(s)


    }


}


func writePrint(wg *sync.WaitGroup, ch chan<- string) {

    wg.Add(1)

    defer wg.Done()


    fmt.Println("Starting to insert data in channel")

    for i := 1; i <= rand.Intn(30); i++ {

        s := uniuri.New()

        ch <- s

    }

    fmt.Println("We are done inserting all data in the channel")

    close(ch)

}


func main() {

    wg := &sync.WaitGroup{}

    var ch = make(chan string)


    go writePrint(wg, ch)

    go makeMePrint(wg, ch)

    time.Sleep(1 * time.Second)

    wg.Wait()

}



查看完整回答
反對(duì) 回復(fù) 2023-07-04
  • 1 回答
  • 0 關(guān)注
  • 153 瀏覽

添加回答

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