From 5ca48c11fbc2944e799da271776405b91a004d42 Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Thu, 11 Mar 2021 17:22:50 +0000 Subject: [PATCH] Update README.md --- ratelimit/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ratelimit/README.md b/ratelimit/README.md index 1f18618..610649e 100644 --- a/ratelimit/README.md +++ b/ratelimit/README.md @@ -2,6 +2,7 @@ Напишите примитив синхронизации, ограничивающий число вызовов на интервале времени. + ```go func NewLimiter(maxCount int, interval time.Duration) *Limiter @@ -10,8 +11,15 @@ func (l *Limiter) Acquire(ctx context.Context) error func (l *Limiter) Stop() ``` +Пользователь создаёт `*Limiter`, указывая параметры `maxCount` и `interval`. + +После этого, пользователь вызывает `Acquire` из многих горутин. Некоторые из вызовов `Acquire` могут завершиться сразу, +а некоторые могут заблокироваться. + `Limiter` должен гарантировать, что на любом интервале времени `interval`, не больше `maxCount` вызовов -`Acquire` могут завершиться без ошибки. +`Acquire` могут завершиться без ошибки. Например, если `interval` равен `1s`, `maxCount` равен 100, +и 200 горутин сделали вызов `Acquire` одновременно, то 100 горутин должны выйти из `Acquire` сразу, а 100 других должны +заблокироваться на секунду. Каждый вызов `Acquire` должен либо завершаться успешно, либо завершаться с ошибкой в случае если `ctx` отменили во время ожидания. Об отмене `ctx` нужно узнавать по закрытию канала `ctx.Done()`. Если `ctx` отменён,