如何通过Channel实现Goroutine Pool
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要为大家展示了"如何通过Channel实现Goroutine Pool",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何通过Channel实现G
千家信息网最后更新 2025年02月04日如何通过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安全错误
数据库的锁怎样保障安全
衡水君诚软件开发有限公司
观看护苗网络安全感言
网络安全达不到国标
山西通信软件开发品质保障
网络安全的儿歌
execl软件开发难度
软件开发的结构化生命
数据库原理课程简介
许昌软件开发网上价格
选修网络技术应用操作题
查看服务器版本号指令
网络安全中的红队
技能等级网络安全
数据库gg同步
网络安全概述图片
sql服务器管理窗口
党委党组落实网络安全义务保护
dell服务器怎么修改sn
阿里巴巴服务器空间多少合适
树状目录结构数据库
表格 公式完成后保留数据库
税务系统提示服务器无法连接
软件开发任务分配原则
广东金税安全接入服务器地址
华为网络安全指数
传统网络安全企业排名
网络安全事件报告范文
我的世界手机版美国服务器
eeprom上的数据库
普通电脑是什么服务器