Проблема совместного использования массива между горутинами

Я пытаюсь решить это упражнение golang https://github.com/loong/go-concurrency-exercises/tree/master/1-производитель-потребитель.

Я думаю, что я близок к решению, но я получаю ошибку взаимоблокировки

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

Где ваше решение не работает?

заранее спасибо

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 06.05.2022 21:56
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
1
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тупик произошел, потому что вы передаете 3 в wg.Add(3), что означает создание 3 групп ожидания, но вам нужна только 1.

Решение заменяет wg.Add(3) на wg.Add(1).

Проверьте мой демо-код здесь

Привет, спасибо за ваш ответ. К сожалению, ожидается, что это упражнение повысит производительность, но с вашим решением для запуска программы потребовалось столько же времени, сколько и без подпрограмм go. И это то, о чем я спрашиваю себя с первого раза: как можно увеличить время выполнения за счет одновременного запуска производителя и потребителя, когда оба не только независимы, но и должны ждать, пока запустится другой. Но в упражнении четко указано, что решение должно использовать параллелизм, и ожидается, что время выполнения будет меньше, если изменить только основную функцию...

cachito 08.05.2022 11:22

Не обращайте внимания на мое предыдущее сообщение, все заработало.

cachito 08.05.2022 19:17

Другие вопросы по теме