Sobes.tech
Назад к вопросам
Middle+
4

Реализуйте функцию cleanup для периодической очистки устаревших данных из bucket'ов. Как организовать фоновую горутину?

Компании, где спрашивали
ООО Дэстэн Партнерс

Ответ от нейросети

sobes.tech AI

Для реализации функции 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 удаляет устаревшие данные по заданному критерию.

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