Я пытаюсь решить это упражнение 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))
}
Где ваше решение не работает?
заранее спасибо
Тупик произошел, потому что вы передаете 3
в wg.Add(3)
, что означает создание 3 групп ожидания, но вам нужна только 1.
Решение заменяет wg.Add(3)
на wg.Add(1)
.
Проверьте мой демо-код здесь
Привет, спасибо за ваш ответ. К сожалению, ожидается, что это упражнение повысит производительность, но с вашим решением для запуска программы потребовалось столько же времени, сколько и без подпрограмм go. И это то, о чем я спрашиваю себя с первого раза: как можно увеличить время выполнения за счет одновременного запуска производителя и потребителя, когда оба не только независимы, но и должны ждать, пока запустится другой. Но в упражнении четко указано, что решение должно использовать параллелизм, и ожидается, что время выполнения будет меньше, если изменить только основную функцию...
Не обращайте внимания на мое предыдущее сообщение, все заработало.
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.