golang实现基于channel的通用连接池详解
来源:脚本之家
2023-01-17 15:06:26
0浏览
收藏
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《golang实现基于channel的通用连接池详解》,聊聊channel、连接池,我们一起来看看吧!
前言
golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池。下面话不多说了,来一起看看详细的介绍吧。
功能
* 连接池中连接类型为interface{},使得更加通用
* 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题
* 使用channel处理池中的链接,高效
何为通用?
连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用的是io.Closer接口,只要是实现了该接口的对象都可以被池管理。
当然,你可以实现基于interface{}的连接池,这样任何对象都可以被管理。
实现原理
将连接句柄存入channel中,由于缓存channel的特性,获取连接时如果池中有连接,将直接返回,如果池中没有连接,将阻塞或者新建连接(没超过最大限制的情况下)。
由于面向接口编程,所有创建连接的逻辑是不清楚的,这里需要传入一个函数,该函数返回一个io.Closer对象。
实现
由于并发问题,在需要操作池中互斥数据的时候需要加锁。
package pool
import (
"errors"
"io"
"sync"
"time"
)
var (
ErrInvalidConfig = errors.New("invalid pool config")
ErrPoolClosed = errors.New("pool closed")
)
type factory func() (io.Closer, error)
type Pool interface {
Acquire() (io.Closer, error) // 获取资源
Release(io.Closer) error // 释放资源
Close(io.Closer) error // 关闭资源
Shutdown() error // 关闭池
}
type GenericPool struct {
sync.Mutex
pool chan io.Closer
maxOpen int // 池中最大资源数
numOpen int // 当前池中资源数
minOpen int // 池中最少资源数
closed bool // 池是否已关闭
maxLifetime time.Duration
factory factory // 创建连接的方法
}
func NewGenericPool(minOpen, maxOpen int, maxLifetime time.Duration, factory factory) (*GenericPool, error) {
if maxOpen maxOpen {
return nil, ErrInvalidConfig
}
p := &GenericPool{
maxOpen: maxOpen,
minOpen: minOpen,
maxLifetime: maxLifetime,
factory: factory,
pool: make(chan io.Closer, maxOpen),
}
for i := 0; i = p.maxOpen {
closer :=
结论
基于该连接池,可以管理所有io.Closer对象。比如memcached,redis等等,非常方便!
总结
今天带大家了解了channel、连接池的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go语言 channel如何实现归并排序中的merge函数详解
- 上一篇
- Go语言 channel如何实现归并排序中的merge函数详解
- 下一篇
- Go语言中切片使用的注意事项小结
查看更多
最新文章
-
- Golang · Go教程 | 17分钟前 |
- Go embed.FS 怎么只暴露指定子目录
- 369浏览 收藏
-
- Golang · Go教程 | 28分钟前 |
- Go os.DirFS 配合 fs.ValidPath 怎么限制相对路径
- 490浏览 收藏
-
- Golang · Go教程 | 40分钟前 | go · filepath · 文件系统 · Go 目录遍历 符号链接 filepath.WalkDir
- Go filepath.WalkDir 怎么在遇到符号链接时保持不跟随
- 127浏览 收藏
-
- Golang · Go教程 | 53分钟前 |
- Go utf8.RuneCountInString 与 len 的统计结果怎么解释
- 393浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go cmp.Or 怎么给多层配置提供首个非零值
- 236浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go maps.Copy 目标 map 为 nil 时为什么不会自动创建
- 108浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go maps.Keys 返回迭代器时怎么限制结果数量
- 364浏览 收藏
-
- Golang · Go教程 | 2小时前 | 标准库 · go · Slices · slices.Clip 三索引切片 Go切片容量
- Go slices.Clip 什么时候值得用于收紧容量
- 263浏览 收藏
-
- Golang · Go教程 | 2小时前 | go · slices.Delete · 切片内存 ·
- Go slices.Delete 后怎么判断底层数组是否还引用元素
- 241浏览 收藏
-
- Golang · Go教程 | 2小时前 | 字符串 · 标准库 · go · strings.Builder Go字符串拼接
- Go strings.Builder 生成字符串后还能继续写吗
- 158浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go bytes.Buffer 复用时怎么避免旧数据残留
- 441浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 29次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 182次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 120次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 46次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 27次使用
查看更多
相关文章
-
- 深入理解Golangchannel的应用
- 2023-01-27 200浏览
-
- GoLangchannel使用介绍
- 2022-12-22 440浏览
-
- Go语言面试题之select和channel的用法
- 2022-12-30 477浏览
-
- Go底层channel实现原理及示例详解
- 2022-12-24 399浏览
-
- Golang channel为什么不会阻塞的原因详解
- 2023-01-27 455浏览

