「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」。
简介
collections是无意在github上发现的一款小巧好用的队列包,还是国人写的,不错不错
目前已有的功能包括:
- 先进先出队列
- 后进先出队列
- 优先队列
- 双端队列
- 有序Map
- 计数器
- 排序
缺点就是已经好几年没更新了,但是了功能还能用😅
官网传送门: github.com/chenjiandon…
安装
先使用go将包下载到本地
go get github.com/chenjiandongx/collections
复制代码
在代码编辑器里面引入既可使用
import "github.com/chenjiandongx/collections"
复制代码
使用
所以的功能方法都在collections里面,不同功能使用不同方法
先进先出
先进先出的优点在一些需要按顺序执行的场景,确保流程可以按照预先 设定好的顺序执行,这在做运维自动化时特别有用(一个脚本执行完后再执行另一个脚本)
运行以下代码会 在控制台输出从0到9的数字(从小到大)
var q = Q()
func Q() *collections.Queue {
q := collections.NewQueue()
return q
}
func main() {
for i :=0; i < 10;i++{
q.Put(i)
}
for i:=0;i <10 ;i++ {
if item,ok:=q.Get(); ok{
fmt.Println(item)
}
}
}
复制代码
后进先出
运行以下代码,会发现 数字是从大到小输出的
func main() {
q := collections.NewLifoQueue()
for i := 0; i < 10; i++ {
q.Put(i)
}
for i := 0; i < 10; i++ {
if item, ok := q.Get(); ok {
fmt.Println(item)
}
}
}
复制代码
实战demo
上面的小demo运行起来好像也没太大问题,但是如果加上了goroutine,在实际运行中可能达不到想要的效果,所以这里需要结合channe来实现一个,可以不断提交任务,但每次只执行一个任务,且只有这个任务执行完了,再执行下一个任务
var (
q = collections.NewQueue()
)
func main() {
go QueueApi()
Web()
}
func Web() {
r := gin.Default()
r.GET("/api/devops", func(c *gin.Context) {
args1 := c.Query("args1")
args2 := c.Query("args2")
data := map[string]string{
"parameters1": args1,
"parameters2": args2,
}
q.Put(data)
c.JSON(http.StatusOK, gin.H{
"message": "commit success",
"data": "ok",
"code": 200,
})
})
r.Run(":8080")
}
func QueueApi() {
fmt.Println("开始监听队列....")
for {
select {
case <-time.After(time.Second * 5):
if item, ok := q.Get(); ok {
result := item.(map[string]string)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
//TODO 具体执行的逻辑
time.Sleep(10 * time.Second)
fmt.Println(result)
}()
wg.Wait()
}
}
}
}
复制代码
该demo使用提顺序执行队列,GET接口/api/devops接收提交参数,可以不停的提交,但是方法QueueApi每5秒循环查一次,当查询到队列里有数据,就开始执行,每次只执行一个,执行成功后。继续循环以上逻辑
#测试
curl --location --request GET 'localhost:8080?args1=hello&args2=world'
复制代码
总结
code的力量还是很强大的,虽然这个包并不出名,作者也不是鼎鼎大名大佬,但是写出来的包依然非常棒(实用)
至于该包的其它的功能,有需要的同学可以自行探索哦
近期评论