在 goroutine 之间发布共享数组

我正在尝试解决这个 golang 练习https://github.com/loong/go-concurrency-exercises/tree/master/1-producer-consumer。


我想我已经接近解决方案了,但是我遇到了死锁错误


davecheney      tweets about golang

beertocode      does not tweet about golang

ironzeb         tweets about golang

beertocode      tweets about golang

vampirewalk666  tweets about golang

fatal error: all goroutines are asleep - deadlock!

这是我的代码


func producer(stream Stream) (tweets []*Tweet) {

    for {

        tweet, err := stream.Next()

        if err == ErrEOF {

            return tweets

        }


        tweets = append(tweets, tweet)

    }

}


func consumer(tweets []*Tweet) {

    for _, t := range tweets {

            if t.IsTalkingAboutGo() {

            fmt.Println(t.Username, "\ttweets about golang")

        } else {

            fmt.Println(t.Username, "\tdoes not tweet about golang")

        }

    }

}


func main() {

    start := time.Now()

    stream := GetMockStream()


    data := make(chan []*Tweet)

    var wg sync.WaitGroup


    wg.Add(3)

    // Producer

    go func() {

        tweets := producer(stream)

        data <- tweets

    }()




    // Consumer

    go func() {

        defer wg.Done()

        tweets := <-data

        consumer(tweets)

    }()


    wg.Wait()

    fmt.Printf("Process took %s\n", time.Since(start))

}

你的解决方案在哪里失败?


慕雪6442864
浏览 76回答 1
1回答

SMILET

发生死锁是因为你传递3给wg.Add(3),这意味着创建 3 个等待组,但你只需要 1 个。解决方案是wg.Add(3)用wg.Add(1).在这里查看我的演示代码
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go