Загрузка…
Загрузка…
Go · junior · сложность 3
Распространенный способ реализации ограничителя скорости в Go — использование буферизованного канала или пакета time вместе с примитивами параллелизма.
package main
import (
"fmt"
"time"
)
func main() {
limit := 5 // Allow 5 concurrent operations
limiter := make(chan struct{}, limit)
for i := 0; i < 10; i++ {
limiter <- struct{}{} // Acquire a slot (blocks if limit is reached)
go func(id int) {
fmt.Printf("Worker %d starting...\n", id)
time.Sleep(time.Second) // Simulate work
fmt.Printf("Worker %d finished.\n", id)
<-limiter // Release the slot
}(i)
}
// In a real service, you'd need a mechanism to wait for all goroutines
// or manage the main goroutine's lifetime.
time.Sleep(3 * time.Second) // Keep main alive for demonstration
}
```
## Разбор
* **Использование `time.Ticker` и канала:** Для ограничения скорости по времени (например, N операций в секунду) вы можете использовать `time.Ticker` для отправки тиков по каналу через фиксированный интервал. Горутина потребляет эти тики и использует другой канал (или буферизованный канал) для управления скоростью операций. Такие библиотеки, как `golang.org/x/time/rate`, предоставляют более сложные реализации корзины токенов.
## Итог
Распространенный способ реализации ограничителя скорости в Go — использование буферизованного канала или пакета `time` вместе с примитивами параллелизма.