Sobes.tech
Middle+
32

Bucket-терден ескірген деректерді кезең-кезеңімен жою үшін cleanup функциясын жүзеге асырыңыз. Артқы жоспардағы goroutine-ді қалай ұйымдастыруға болады?

Сұралған компаниялар
ООО Дэстэн Партнерс

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

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