ratelimit

package
v0.0.0-...-50b27ac Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 3, 2023 License: MIT Imports: 3 Imported by: 0

README

ratelimit

Напишите примитив синхронизации, ограничивающий число вызовов на интервале времени.

func NewLimiter(maxCount int, interval time.Duration) *Limiter

func (l *Limiter) Acquire(ctx context.Context) error

func (l *Limiter) Stop()

Пользователь создаёт *Limiter, указывая параметры maxCount и interval.

После этого, пользователь вызывает Acquire из многих горутин. Некоторые из вызовов Acquire могут завершиться сразу, а некоторые могут заблокироваться.

Limiter должен гарантировать, что на любом интервале времени interval не больше maxCount вызовов Acquire могут завершиться без ошибки. Например, если interval равен 1s, maxCount равен 100, и 200 горутин сделали вызов Acquire одновременно, то 100 горутин должны выйти из Acquire сразу, а 100 других должны заблокироваться на секунду.

Каждый вызов Acquire должен либо завершаться успешно, либо завершаться с ошибкой в случае если ctx отменили во время ожидания. Об отмене ctx нужно узнавать по закрытию канала ctx.Done(). Если ctx отменён, нужно возвращать ошибку ctx.Err().

Вызовы Acquire() после Stop() должны сразу завершаться с ошибкой ErrStopped.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrStopped = errors.New("limiter stopped")

Functions

This section is empty.

Types

type Limiter

type Limiter struct {
}

Limiter is precise rate limiter with context support.

func NewLimiter

func NewLimiter(maxCount int, interval time.Duration) *Limiter

NewLimiter returns limiter that throttles rate of successful Acquire() calls to maxSize events at any given interval.

func (*Limiter) Acquire

func (l *Limiter) Acquire(ctx context.Context) error

func (*Limiter) Stop

func (l *Limiter) Stop()

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL