Sobes.tech
Back to questions
Middle+
3

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

Companies where asked
ООО Дэстэн Партнерс

Answer from AI

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

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