HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: golang, скорость операций</p>
1 <p>Теги: golang, скорость операций</p>
2 <p>Для ограничения скорости операций в единицу времени в языке программирования Go можно использовать time.Ticker. Это неплохо работает для скоростей до нескольких десятков операций в секунду. Если же речь идет о более высоких скоростях, тогда лучше отдавать предпочтение ограничителю скорости сегмента токенов, например,<strong>Limiter</strong>из<em>golang.org/x/time/rate</em>.</p>
2 <p>Для ограничения скорости операций в единицу времени в языке программирования Go можно использовать time.Ticker. Это неплохо работает для скоростей до нескольких десятков операций в секунду. Если же речь идет о более высоких скоростях, тогда лучше отдавать предпочтение ограничителю скорости сегмента токенов, например,<strong>Limiter</strong>из<em>golang.org/x/time/rate</em>.</p>
3 import "time" const rateLimit = time.Second / 10 // 10 calls per second // Client это интерфейс, // который вызывает что-то с полезной нагрузкой. type Client interface { Call(*Payload) } // Payload это некоторая полезная нагрузка, // которую Client отправляет при вызове. type Payload struct {} // RateLimitCall ограничивает скорость клиентских вызовов полезной нагрузки. func RateLimitCall(client Client, payloads []*Payload) { throttle := time.Tick(rateLimit) for _, payload := range payloads { &lt;-throttle // ограничение скорости клиентских вызовов go client.Call(payload) } }<p>Если же надо разрешить некоторые всплески, достаточно добавить буфер к дросселю:</p>
3 import "time" const rateLimit = time.Second / 10 // 10 calls per second // Client это интерфейс, // который вызывает что-то с полезной нагрузкой. type Client interface { Call(*Payload) } // Payload это некоторая полезная нагрузка, // которую Client отправляет при вызове. type Payload struct {} // RateLimitCall ограничивает скорость клиентских вызовов полезной нагрузки. func RateLimitCall(client Client, payloads []*Payload) { throttle := time.Tick(rateLimit) for _, payload := range payloads { &lt;-throttle // ограничение скорости клиентских вызовов go client.Call(payload) } }<p>Если же надо разрешить некоторые всплески, достаточно добавить буфер к дросселю:</p>
4 import "time" const rateLimit = time.Second / 10 // 10 calls per second // Client это интерфейс, // который вызывает что-то с полезной нагрузкой. type Client interface { Call(*Payload) } // Payload это некоторая полезная нагрузка, // которую Client отправляет при вызове. type Payload struct {} // BurstRateLimitCall позволяет ограничивать // пакетную скорость клиентских вызовов полезной нагрузки. func BurstRateLimitCall(ctx context.Context, client Client, payloads []*Payload, burstLimit int) { throttle := make(chan time.Time, burstLimit) ctx, cancel := context.WithCancel(ctx) defer cancel() go func() { ticker := time.NewTicker(rateLimit) defer ticker.Stop() for t := range ticker.C { select { case throttle &lt;- t: case &lt;-ctx.Done(): return // выходим из горутины, когда окружающая функция завершается } } }() for _, payload := range payloads { &lt;-throttle // ограничение скорости клиентских вызовов go client.Call(payload) } }<p><em>По материалам блога https://golang-blog.blogspot.com/.</em></p>
4 import "time" const rateLimit = time.Second / 10 // 10 calls per second // Client это интерфейс, // который вызывает что-то с полезной нагрузкой. type Client interface { Call(*Payload) } // Payload это некоторая полезная нагрузка, // которую Client отправляет при вызове. type Payload struct {} // BurstRateLimitCall позволяет ограничивать // пакетную скорость клиентских вызовов полезной нагрузки. func BurstRateLimitCall(ctx context.Context, client Client, payloads []*Payload, burstLimit int) { throttle := make(chan time.Time, burstLimit) ctx, cancel := context.WithCancel(ctx) defer cancel() go func() { ticker := time.NewTicker(rateLimit) defer ticker.Stop() for t := range ticker.C { select { case throttle &lt;- t: case &lt;-ctx.Done(): return // выходим из горутины, когда окружающая функция завершается } } }() for _, payload := range payloads { &lt;-throttle // ограничение скорости клиентских вызовов go client.Call(payload) } }<p><em>По материалам блога https://golang-blog.blogspot.com/.</em></p>
5  
5