值得一看
广告
彩虹云商城
广告

热门广告位

如何在Golang中实现并发限流

使用带缓冲channel实现并发限流,通过固定容量channel作为许可证池控制最大并发数;2. 采用golang.org/x/sync/semaphore的WeightedSemaphore支持超时和上下文取消,适合复杂场景;3. 基于rate.Limiter控制请求速率,适用于API调用等需限频的场景;4. 根据需求选择合适方法:限并发用channel或信号量,限频率用rate.Limiter,可组合使用。

如何在golang中实现并发限流

在Golang中实现并发限流,核心目标是控制同时运行的协程数量,防止系统资源被耗尽。常用方法包括使用带缓冲的channel、semaphore(信号量)或第三方库如golang.org/x/sync/semaphore。下面介绍几种实用且清晰的实现方式。

使用Buffered Channel控制并发数

通过一个固定容量的channel来充当“许可证池”,每个goroutine执行前需先获取一个许可,执行完后归还。这种方式简单直观,适合大多数场景。

示例代码:

func main() {
maxConcurrency := 3
sem := make(chan struct{}, maxConcurrency)
<pre class='brush:php;toolbar:false;'>for i := 0; i < 10; i++ {
sem <- struct{}{} // 获取许可
go func(id int) {
defer func() { <-sem }() // 释放许可
fmt.Printf("处理任务 %d\n", id)
time.Sleep(2 * time.Second) // 模拟工作
fmt.Printf("完成任务 %d\n", id)
}(i)
}
// 等待所有任务完成(这里可用WaitGroup更精确)
time.Sleep(10 * time.Second)

}

立即学习“go语言免费学习笔记(深入)”;

这种方式利用channel的阻塞特性自动实现限流,当channel满时,新的goroutine会等待,直到有空位。

使用golang.org/x/sync/semaphore

标准库没有原生信号量,但golang.org/x/sync包提供了WeightedSemaphore,支持异步获取,还能处理超时和上下文取消,更适合复杂控制。

安装:

go get golang.org/x/sync/semaphore

使用示例:

如知AI笔记

如知AI笔记

如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型

如知AI笔记27

查看详情
如知AI笔记

sem := semaphore.NewWeighted(3) // 最多3个并发
<p>for i := 0; i < 10; i++ {
if err := sem.Acquire(context.Background(), 1); err != nil {
log.Printf("获取信号量失败: %v", err)
continue
}</p><pre class='brush:php;toolbar:false;'>go func(id int) {
defer sem.Release(1)
fmt.Printf("处理任务 %d\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("完成任务 %d\n", id)
}(i)

}

立即学习“go语言免费学习笔记(深入)”;

优势在于可结合context实现超时控制,例如:

ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)

基于Ticker的速率限流(RPS控制)

如果关注的是请求频率(如每秒最多10次),可以用time.Tickergolang.org/x/time/rate实现。

使用rate.Limiter示例:

import "golang.org/x/time/rate"
<p>limiter := rate.NewLimiter(10, 1) // 每秒10个,突发1</p><p>for i := 0; i < 100; i++ {
limiter.Wait(context.Background())
go func(id int) {
fmt.Printf("执行任务 %d\n", id)
}(i)
}</p>

注意:这种方式控制的是请求发起速率,不直接限制并发数,适合API调用等场景。

选择哪种方式取决于需求:控制最大并发数用channel或WeightedSemaphore;控制请求频率用rate.Limiter。实际项目中常组合使用,比如先限频再限并发。

基本上就这些,关键点是理解不同工具的适用场景,避免过度设计。

相关标签:

go golang 工具 ai api调用 标准库 red golang 并发 channel 异步

大家都在看:

深入理解Go程序执行:go run与go build的差异与应用
Go语言中如何判断 interface{} 是否为任意类型的 Map
Go语言中SVG到图像的转换:利用外部工具实现
使用Go语言实现高效的并行URL请求与超时控制
Go语言并发编程:解决Goroutine中循环变量捕获的常见问题
温馨提示: 本文最后更新于2025-10-14 18:42:05,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容