Задачи на таймер
1) Напишите функцию - троттлер trottle(f,ms), которая передает вызов в функцию f не более 1 раза в ms милисекунд, те вызовы, которые препадают на интервал простоя - должны игнорироваться. Напишите программу для демонстрации работы функции trottle.
package main
import (
"fmt"
"time"
)
// throttle принимает функцию f и интервал времени ms (в миллисекундах).
// Возвращает функцию, которую можно вызывать с той же частотой,
// но f будет выполняться не чаще одного раза в указанный интервал.
func throttle(f func(), ms int) func() {
timer := time.NewTimer(0) // Создаем таймер с нулевой длительностью для немедленного первого вызова
<-timer.C // Сразу же освобождаем таймер
throttled := false // Флаг, указывающий, активен ли таймер
return func() {
if !throttled {
throttled = true
f() // Вызываем функцию f
timer.Reset(time.Duration(ms) * time.Millisecond)
go func() {
<-timer.C
throttled = false
}()
}
}
}
func main() {
count := 0
increment := func() {
count++
fmt.Println("Incremented:", count)
}
throttledIncrement := throttle(increment, 1000) // Создаем троттлированную версию функции increment
// Пытаемся вызвать функцию несколько раз с интервалом в 300 мс
for i := 0; i < 10; i++ {
throttledIncrement()
fmt.Println("Try:", i)
time.Sleep(300 * time.Millisecond)
}
// Даем время для последнего вызова
time.Sleep(1500 * time.Millisecond)
fmt.Println("Final count:", count)
}Last updated