Sobes.tech
Middle+

Comment organiseriez-vous une goroutine en arrière-plan pour nettoyer périodiquement les données obsolètes des buckets dans une fonction de nettoyage?

sobes.tech IA

Réponse de l'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 удаляет устаревшие данные по заданному критерию.

Таким образом, фоновая горутина постоянно работает и поддерживает данные в актуальном состоянии.