使用带缓冲channel可限制最大并发数,如10个goroutine;基于time.Ticker可实现漏桶限流,按固定速率处理请求,保障系统稳定性。

在高并发场景下,Golang常用于构建高性能服务,但如果不加控制地处理大量请求,可能导致系统资源耗尽、数据库压力过大或第三方接口被限。因此,并发限流是保障系统稳定性的关键手段。Golang提供了多种方式实现并发请求的限流与控制,下面介绍几种常用且实用的方法。
最基础的限流方式是通过固定大小的带缓冲 channel 控制最大并发数。每个请求需要先从 channel 获取一个“令牌”,处理完成后再释放。
这种方式适合控制最大并发量,例如限制同时最多10个 goroutine 执行任务:
var limitCh = make(chan struct{}, 10) // 最多10个并发
<p>func handleRequest() {
limitCh <- struct{}{} // 获取令牌
defer func() { <-limitCh }() // 释放令牌</p><pre class='brush:php;toolbar:false;'>// 处理业务逻辑
doWork()}
立即学习“go语言免费学习笔记(深入)”;
这种方法简单直观,适用于不需要精确时间窗口控制的场景。
如果希望以固定速率处理请求(如每秒最多处理5个),可以使用 time.Ticker 模拟漏桶算法。
func rateLimiter(rps int) <-chan struct{} {
ch := make(chan struct{})
go func() {
ticker := time.NewTicker(time.Second / time.Duration(rps))
for range ticker.C {
select {
case ch <- struct{}{}:
default: // 非阻塞发送,避免堆积
}
}
}()
return ch
}
<p>// 使用示例
limiter := rateLimiter(5) // 每秒5次
for i := 0; i < 100; i++ {
<-limiter
go handleRequest()
}</p>这种模式能平滑控制请求速率,防止突发流量冲击后端服务。
本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
Golang官方扩展库 golang.org/x/time/rate 提供了成熟的令牌桶实现,支持突发请求和长期速率控制,是生产环境推荐的方式。
import "golang.org/x/time/rate"
<p>limiter := rate.NewLimiter(rate.Limit(10), 5) // 每秒10个,最多允许5个突发</p><p>for i := 0; i < 100; i++ {
if !limiter.Allow() {
continue // 跳过或排队
}
go handleRequest()
}</p>也可以用 Wait() 方法阻塞等待令牌,确保请求按速率执行:
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
<p>if err := limiter.Wait(ctx); err != nil {
// 超时或被取消
return
}
handleRequest()</p>该方法灵活支持上下文超时、突发容量设置,适合API调用、微服务间通信等场景。
在并发控制中,应始终使用 context 避免 goroutine 泄漏。将限流与 context 结合,可实现更安全的请求管理。
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
<p>limiter := rate.NewLimiter(1, 1)
for i := 0; i < 100; i++ {
go func(id int) {
if err := limiter.Wait(ctx); err != nil {
log.Printf("request %d timed out", id)
return
}
doWork()
}(i)
}</p>这样即使某个请求卡住,也能及时退出,避免资源浪费。
基本上就这些。根据实际需求选择合适的方式:简单并发控制用 channel,固定速率用 Ticker,复杂场景推荐 rate 包。合理限流能让系统更健壮,响应更可控。
以上就是Golang如何实现并发限流_Golang并发请求限流与控制方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号