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

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

goroutine 從具有動態循環的通道讀取等待組,在上一個返回之前重用

goroutine 從具有動態循環的通道讀取等待組,在上一個返回之前重用

Go
qq_花開花謝_0 2023-07-04 16:51:06
我正在開發一個小型實用程序,它需要迭代動態范圍的項目(可以是 100 或可以是 100000)并將這些項目放入通道中。另一個函數從該通道讀取項目并單獨對每個項目進行一些處理。我試圖用來sync.WaitGroup確保在處理通道中的所有項目之前我的實用程序不會退出。由于我對頻道和等待組相當陌生,因此我遇到了錯誤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()}這是我正在研究的主要思想(不是確切的代碼,而是具有相同數量功能的完全相同的架構)。如何確保該實用程序僅在通道中的所有項目都是進程時才退出。任何幫助表示贊賞。
查看完整描述

1 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

我終于讓它發揮作用了。


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

}



查看完整回答
反對 回復 2023-07-04
  • 1 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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