如何通过Channel实现Goroutine Pool
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要为大家展示了"如何通过Channel实现Goroutine Pool",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何通过Channel实现G
千家信息网最后更新 2025年12月02日如何通过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安全错误
数据库的锁怎样保障安全
大学缴费软件开发团队
常熟网络技术咨询电话
数据库课程设计经典例题
少林拳视频软件开发
计算机网络技术的未来规划
成电的网络安全研究生专业目录
怎么清除数据库挂起、
人才紧缺 网络安全
网络安全教育征文300字
网络安全 三授权
求生之路无限火力服务器叫什么
国外网络安全事件影响国内
天津特色软件开发供应商
路由器显示远端服务器没有响应
数据库多条件查询格式
在面向对象软件开发过程中
web向数据库写入数据
网络安全净化中心
荆门定制软件开发中心
常见网络安全高危漏洞全解析
国泰安数据库代码都一样吗
杭州恒生软件开发实习生待遇
福州靠谱网络技术
网络安全进社区宣传报道
方舟mod服务器加载失败
什么专业可以从事软件开发
浪潮服务器云南代理商
网络安全宣传讨论稿
朝阳软件开发费用
软件开发人员经验