Middle+
Como organizar uma goroutine em segundo plano para limpar periodicamente dados desatualizados dos buckets numa função de limpeza?
sobes.tech IA
Resposta da IA
Для реализации функции cleanup, которая периодически очищает устаревшие данные из bucket'ов, можно использовать горутину с таймером, которая будет запускаться в фоне и выполнять очистку с заданным интервалом.
Пример реализации:
package main
import (
"time"
"fmt"
)
type Bucket struct {
data map[string]time.Time // пример: ключ и время добавления
}
func (b *Bucket) Cleanup(expiration time.Duration) {
now := time.Now()
for key, t := range b.data {
if now.Sub(t) > expiration {
delete(b.data, key)
fmt.Println("Удалён устаревший ключ:", key)
}
}
}
func cleanup(buckets []*Bucket, interval time.Duration, expiration time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
for _, b := range buckets {
b.Cleanup(expiration)
}
}
}
}
func main() {
buckets := []*Bucket{
{data: make(map[string]time.Time)},
{data: make(map[string]time.Time)},
}
// Запускаем фоновую горутину для очистки каждые 10 секунд
go cleanup(buckets, 10*time.Second, 1*time.Minute)
// Основной код
select {} // блокируем main, чтобы программа не завершилась
}
Здесь:
cleanup— функция, запускающаяся в отдельной горутине и вызывающая очистку по таймеру.- Используется
time.Tickerдля периодического срабатывания. - Метод
Cleanupу каждого bucket удаляет устаревшие данные по заданному критерию.
Таким образом, фоновая горутина постоянно работает и поддерживает данные в актуальном состоянии.