Я боролся с проблемой в течение последнего дня или около того в поиске лучшего способа создания N одновременных функций, которые периодически вызываются с одинаковым интервалом в Go. Я хочу иметь возможность указывать произвольное количество функций, периодически запускать их все одновременно и завершать все через определенное время.
Сейчас у меня есть решение, которое работает, но для каждой одновременной функции необходимо создать новый тикер. Я также не уверен, как правильно использовать sync.WaitGroup, так как моя текущая реализация приводит к тому, что программа никогда не заканчивается (просто застревает в конце wg.Wait ())
Я кратко посмотрел на оболочку тикера под названием Multitick , но я не уверен, как это реализовать. Может быть, Multitick может быть решением здесь?
func main() {
N := 10
var wg sync.WaitGroup
wg.Add(N)
quit := make(chan struct{})
for i := 0; i < N; i++ {
tick := time.NewTicker(500 * time.Millisecond)
go func(t *time.Ticker) {
for a := range tick.C {
select {
case <-quit:
break
default:
fmt.Println(a) // do something on tick
}
}
wg.Done()
}(tick)
}
time.Sleep(10 * time.Second)
close(quit)
wg.Wait()
}
Демонстрация Go Playground
Таким образом, это решение работает, выполняя все тикеры одновременно с надлежащими интервалами и заканчивая через 10 секунд, но на самом деле оно не выходит из программы, зависая в конце строки wg.Wait (). Кроме того, каждый параллельный вызов функции использует свой собственный тикер. Можно ли как-нибудь использовать один «главный» тикер, с которого работают все функции?
Заранее спасибо! Это мой первый раз, когда я действительно углубляюсь в параллелизм в Go.