当前位置: 首页 > news >正文

做一钓鱼网站建立网站做家教辅导

做一钓鱼网站,建立网站做家教辅导,wordpress.org配置,如何注册个人网站写在文章开头 我们希望通过go语言实现一个简单的资源池,而这个资源池的资源包括但不限于: 数据库连接池线程池协程池网络连接池 只要这些资源实现我们指定的关闭方法,则都可以通过我们封装的资源池进行统一管理,需要简单说明一下这个资源池…

写在文章开头

我们希望通过go语言实现一个简单的资源池,而这个资源池的资源包括但不限于:

  1. 数据库连接池
  2. 线程池
  3. 协程池
  4. 网络连接池

只要这些资源实现我们指定的关闭方法,则都可以通过我们封装的资源池进行统一管理,需要简单说明一下这个资源池的要求:

  1. 需要用户指定资源以及资源的创建方法。
  2. 当协程通过Acquire方法获取资源时,若发现当前池中有资源可以分配则直接返回,若没有足够的资源则基于传入的创建方法创建一个全新的资源分配。
  3. 支持资源释放和资源池关闭。

在这里插入图片描述

听起来很像是Java的无界线程池,接下来我们就基于这个需求实现一个版本。

在这里插入图片描述

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

需求落地

给出资源池结构

我们首先需要给出资源池的结构,很明显作为一个资源池它需要有一个管理资源池的channel,为了保证多协程竞争资源的协程安全,我们还需要通过一把Mutex完成操作互斥,同时给出创建资源的工厂方法要求这个工厂方法创建的资源具备资源关闭能力:

// Pool 定义一个结构体 包含重量级锁 有缓冲区Chanel 工厂方法 连接池关闭状态
type Pool struct {m        sync.Mutexresource chan io.Closerfactory  func() (io.Closer, error)closed   bool
}

创建资源池

有个上述的定义之后,我们的创建方法就很容易实现了,只需基于外部的size和工厂方法完成Pool成员变量初始化即可:

var ErrPoolClosed = errors.New("连接池已关闭")func New(fn func() (io.Closer, error), size uint) (*Pool, error) {//判断size大小是否合法if size <= 0 {return nil, errors.New("size不合法")}//基于工厂方法和size创建资源池return &Pool{resource: make(chan io.Closer, size),factory:  fn,}, nil}

获取资源

当协程需要获取资源时,会查看当前缓冲通道是否有足够的资源,如果有则在正确运行的情况下返回出去,反之基于我们上文传入的工厂方法完成资源创建并返回:

func (p *Pool) Acquire() (io.Closer, error) {select {//如果channel有足够的资源分配则直接返回case r, ok := <-p.resource:if !ok {log.Println("连接池已关闭")return nil, ErrPoolClosed}log.Println("拿到连接池共享资源")return r, nil//基于工厂方法创建全新的资源返回出去default:log.Println("资源不足,创建新的连接资源")return p.factory()}}

释放与关闭

这里我们将资源的释放和关闭放在一起说明,在进行资源释放和关闭时我们需要考虑3个问题即:

  1. 已关闭的资源池无需归还资源。
  2. 正在关闭资源池时不可归还资源。
  3. 正在归还资源时不可关闭资源池。

所以进行这两个操作时,我们需要通过互斥锁确保两个操作互斥:

// Release 上锁 设置方法退出后解锁 查看当前连接池是否已关闭,若关闭则直接将资源关闭 ,反之select查看能否将其存入缓冲区,若可以输出入队成功,反之输出队列已满
func (p *Pool) Release(r io.Closer) {//上锁确保关闭和归还资源操作互斥p.m.Lock()//函数退出时解锁defer p.m.Unlock()//如果资源池关闭则直接将当前资源关闭销毁if p.closed {log.Println("连接池已关闭,直接销毁当前资源")r.Close()}//将连接归还,如果满了则直接关闭销毁select {case p.resource <- r:log.Println("连接归还成功")default:log.Println("连接池已满,资源直接销毁")r.Close()}}// Close 方法 上锁 设置方法退出后解锁 遍历所有资源将其关闭 然后再关闭连接池
func (p *Pool) Close() {p.m.Lock()defer p.m.Unlock()if p.closed {log.Println("连接池已关闭,直接销毁当前资源")return}//设置为关闭p.closed = true//关闭资源close(p.resource)//遍历资源池资源for r := range p.resource {r.Close()}}

测试代码与输出

最后我们给出测试代码,可以看到我们基于资源池工具类模拟数据库连接池的管理:

//设置最大协程数与资源池数为24
const maxGoroutines = 24
const poolResources = 24//创建可关闭的数据库连接
type dbConnection struct {ID int32
}
//对应的关闭方法
func (d *dbConnection) Close() error {log.Println("当前数据库连接", d.ID, "已关闭")return nil
}var idCounter int32func createConnection() (io.Closer, error) {id := atomic.AddInt32(&idCounter, 1)return &dbConnection{ID: id}, nil
}func main() {//创建maxGoroutines个WaitGroupvar wg sync.WaitGroupwg.Add(maxGoroutines)//传入createConnection方法和连接池大小poolResources创建数据库连接池p, err := pool.New(createConnection, poolResources)if err != nil {log.Println(err)}//创建24个协程获取资源for i := 0; i < maxGoroutines; i++ {go func(queryParam int) {queryData(queryParam, p)defer wg.Done()}(i)}//等待操作完成关闭连接池wg.Wait()log.Println("查询完成")p.Close()}
//queryData 基于连接池Acquire获取资源,完成后通过Release归还资源
func queryData(queryParam int, p *pool.Pool) {r, e := p.Acquire()if e != nil {log.Println(e)return}defer p.Release(r)time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)log.Println("查询", queryParam, "使用连接", r.(*dbConnection).ID)
}

同时我们给出输出结果:

2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 资源不足,创建新的连接资源
2024/05/05 23:36:10 查询 17 使用连接 14
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 5 使用连接 5
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 3 使用连接 2
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 19 使用连接 19
2024/05/05 23:36:10 连接归还成功
.......

小结

以上便是笔者对于无界资源池的实现思路,希望对你有帮助。

我是 sharkchiliCSDN Java 领域博客专家开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

参考

《go in action》

http://www.yayakq.cn/news/893407/

相关文章:

  • 安徽中擎建设公司网站免费私人网站建设平台
  • 邢台城乡规划局建设工程网站衡阳网站备案
  • 能播放优酷视频的网站怎样做海尔网站建设不足之处
  • 咨询公司网站网站平台项目交接需要什么
  • 珠海市网站建设品牌网站的构建一般要多久
  • 买衣服网站排行榜前十名wordpress页面访问量
  • 菏泽网站建设装修之家网
  • 建设银行园区公积金管理中心网站公司开发个网站
  • wordpress零基础建站教程视频网页设计个人总结800
  • 五分钟自己创建网站的方法mysql 瓶颈 wordpress
  • 邢台做网站多少钱百度知道电脑版网页入口
  • 物流网站怎么开d8 wordpress
  • 如何设置网站服务器访问权限上海网站建设技术
  • 天津网站建设91fyh设计师找图网站
  • 公司网站建设情况说明书企业网站的特征
  • 国外论文类网站有哪些天马网络 网站建设
  • 广西壮族自治区建设厅网站企业163邮箱登录
  • 哪些企业网站做的比较好平谷手机网站建设
  • 文学投稿网站平台建设WordPress菜单太长
  • 深圳哪里网站制作专题探索网站开发模式特点
  • 网站引导页动态效果怎么做公众号 创意名字
  • 做百度竞价对网站有无要求东莞做网站找微客巴巴
  • 西安网站建设总部做网站有什么要求
  • 制造业公司有必要建设网站吗免费发布产品网站
  • 做网站的优势广东省阳江网络问政平台
  • 深圳做app网站建设html制作个人主页
  • 哪个网站可以做翻译赚钱月嫂服务公司网站建设方案
  • 哪些网站可以做海报热点的cetos做网站
  • 如何创建本地站点做网站的是外包公司吗
  • 昆山网站建设费用站长平台有哪些