2021-03-02 18:05:37 +00:00
|
|
|
|
# ratelimit
|
|
|
|
|
|
|
|
|
|
Напишите примитив синхронизации, ограничивающий число вызовов на интервале времени.
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func NewLimiter(maxCount int, interval time.Duration) *Limiter
|
|
|
|
|
|
|
|
|
|
func (l *Limiter) Acquire(ctx context.Context) error
|
2021-03-05 11:06:01 +00:00
|
|
|
|
|
|
|
|
|
func (l *Limiter) Stop()
|
2021-03-02 18:05:37 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`Limiter` должен гарантировать, что на любом интервале времени `interval`, не больше `maxCount` вызовов
|
|
|
|
|
`Acquire` могут завершиться без ошибки.
|
|
|
|
|
|
|
|
|
|
Каждый вызов `Acquire` должен либо завершаться успешно, либо завершаться с ошибкой в случае если `ctx` отменили
|
2021-03-05 11:20:55 +00:00
|
|
|
|
во время ожидания. Об отмене `ctx` нужно узнавать по закрытию канала `ctx.Done()`. Если `ctx` отменён,
|
2021-03-05 11:06:01 +00:00
|
|
|
|
нужно возвращать ошибку `ctx.Err()`.
|
|
|
|
|
|
|
|
|
|
Вызовы `Acquire()` после `Stop()`, должны сразу завершаться с ошибкой ErrStopped.
|