为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信