如何通过Channel实现Goroutine Pool
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要为大家展示了"如何通过Channel实现Goroutine Pool",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何通过Channel实现G
千家信息网最后更新 2026年10月31日如何通过Channel实现Goroutine Pool
这篇文章主要为大家展示了"如何通过Channel实现Goroutine Pool",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何通过Channel实现Goroutine Pool"这篇文章吧。
最近用到了 Go 从 Excel 导数据到服务器内部 用的是 http 请求
但是发现一个问题 从文件读取之后 新开 Goroutine 会无限制新增
导致全部卡在初始化请求 于是乎就卡死了
问题模拟
模拟代码
func main() { pool := sync.WaitGroup{} for i := 0; i < 500; i++ { pool.Add(1) go func(i int) { resp, err := http.Get("http://ip.3322.org") if err != nil { fmt.Println(i, err) } else { defer resp.Body.Close() result, _ := ioutil.ReadAll(resp.Body) fmt.Println(i, string(result)) } pool.Done() }(i) } pool.Wait()}数量小的情况下 没有问题 但是数量比较大的情况 就会发现程序直接卡死 一段时间之后报错 并且没有发出任何请求
问题解决
实际上看的出来 是应为同时发起了太多的HTTP请求 导致系统卡死 数据没有发送
想到我在Java中用Thread提交请求 我就考虑 可不可限制 Goroutine 的数量
使用强大的百度 果然找到了大佬已经写好的协程池
代码如下 我加上了注释
package gopoolimport ( "sync")// Pool Goroutine Pooltype Pool struct { queue chan int wg *sync.WaitGroup}// New 新建一个协程池func New(size int) *Pool { if size <= 0 { size = 1 } return &Pool{ queue: make(chan int, size), wg: &sync.WaitGroup{}, }}// Add 新增一个执行func (p *Pool) Add(delta int) { // delta为正数就添加 for i := 0; i < delta; i++ { p.queue <- 1 } // delta为负数就减少 for i := 0; i > delta; i-- { <-p.queue } p.wg.Add(delta)}// Done 执行完成减一func (p *Pool) Done() { <-p.queue p.wg.Done()}// Wait 等待Goroutine执行完毕func (p *Pool) Wait() { p.wg.Wait()}然后修改刚才的测试方法
package mainimport ( "io/ioutil" "log" "net/http" "yumc.pw/cloud/lib/gopool")func main() { // 这里限制5个并发 pool := gopool.New(5)// sync.WaitGroup{} for i := 0; i < 500; i++ { pool.Add(1) go func(i int) { resp, err := http.Get("http://ip.3322.org") if err != nil { fmt.Println(i, err) } else { defer resp.Body.Close() result, _ := ioutil.ReadAll(resp.Body) fmt.Println(i, string(result)) } pool.Done() }(i) } pool.Wait()}以上是"如何通过Channel实现Goroutine Pool"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
问题
内容
数量
篇文章
代码
情况
数据
学习
帮助
限制
强大
中用
同时
实际
实际上
文件
方法
无限制
时间
易懂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
互联网科技公司华为
互联网科技资迅
互联网科技与金融科技
合肥互联网科技公司
卓越科技(互联网 )
掌上梦互联网科技
互联网科技股午盘股票涨跌
互联网科技生活的内容
华脉科技工业互联网产品
广西拼得多互联网科技有限公司
开启互联网科技时代小说
互联网企业和科技型企业
互联网软件和科技
南平创想时代互联网科技有限公司
工业互联网等科技实现智能化赋能
互联网数据科技专业
智帮互联网科技公司最近动向
互联网科技手机排行榜
悟空问答互联网科技
重生之互联网科技帝国
互联网络科技有限公司
科技服务与互联网
互联网 科技创业
蓝色互联网科技
半导体是互联网高科技吗
青岛易易互联网科技
数字科技和互联网金融哪个好
华人运通互联网科技公司
伍佰万互联网科技是干嘛的