Как при запуске группы горутин на Golang удалить всю предыдущую группу
Программа работает постоянно. Есть функция которая запускает 10 горутин, которые получают данные и передают их в канал
Затем мы считываем данные с канала.
Проблема вот в чем. Если мы считаем 5 раз и больше нам не нужно, а затем запустим эту функцию и будем читать данные с канала до тех пор пока они есть, то вернется 5 предыдущих значений и 10 новых
Как сделать чтобы все предыдущие данные не считывались, а вернулись только 10 новых значений?
То есть перевести группу горутин в первоначальное состояние
import (
"fmt"
"time"
)
var resChan = make(chan string)
var counter = 0
func main() {
getItems(5)
fmt.Println("")
getItems(1000)
}
func getItems(cnt int) {
work()
for i := 0; i < cnt; i++ {
if counter == 0 {
break
}
counter -= 1
fmt.Println(<-resChan)
}
}
func work() {
var words = []string{"A", "B", "C", "D", "E", "F", "G", "K", "M", "S"} // 10 elemens
counter += len(words)
for _, word := range words {
go func(word string) {
time.Sleep(1 * time.Second)
resChan <- word
}(word)
}
}
Ответы (1 шт):
давайте мысленно подебажим вашу программу.
- запустили
getItems(5) - запускает
work() - внутри
work()абсолютно новый списокvar wordsпередается в канал - прочитали 5 элементов
- запустили getItems(1000)
- запускает
work() - внутри
work()абсолютно новый списокvar wordsпередается в канал. то есть еще 10 элементов - хотим прочитать 1000 раз, но сможем только 15
почему 15? да потому что у нас resChan - общая переменная. мы в него в первый раз записали 10 элементов, прочитали 5. осталось еще 5. потом записали еще 10(пункт 7), поэтому, суммарно сможем прочитать 15.
по сути, вы хотите обнулить канал. можно создать его еще раз
func work() {
var words = []string{"A", "B", "C", "D", "E", "F", "G", "K", "M", "S"} // 10 elemens
resChan = make(chan string)
counter += len(words)
for _, word := range words {
go func(word string) {
time.Sleep(1 * time.Second)
resChan <- word
}(word)
}
}
но такой подход - плохой. вы меняете канал в другом месте, который за него не отвечает. лучше запишите один раз в канал, потом читайте сколько хотите.