goFrame的队列gqueue对比channel使用详解
channel
首先明确一下channel的作用:用于go协程间的通信。
go语言最大的特点就是支持高并发:goroutine和channel是支持高并发的重要组成部分。
单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
如果说 goroutine 是Go程序并发的执行体,channel
就是它们之间的连接。channel
是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。
另外要明确知道go的并发哲学,铭记这句原则:用通信来共享内存,而不要用共享内存来通信。
在搞清楚channel的作用之后我们再来研究GoFrame框架(下文简称gf)中gqueue的特点。
gqueue
概念
队列 gqueue 动态大小的并发安全队列
gqueue也可以设置为固定大小的队列,固定大小时和标准库channel没区别。
简单来说channel实现的功能gqueue也能实现。
使用场景:
gqueue是并发安全的,常用于多个goroutine数据通信且支持动态队列大小的场景
代码演示
package main import ( "fmt" "github.com/gogf/gf/container/gqueue" "github.com/gogf/gf/os/gtimer" "time" ) func main() { //实例化gqueue q := gqueue.New() //数据生产者 每隔1秒想队列写入1条数据 gtimer.SetInterval(time.Second, func() { nowStr := time.Now().String() q.Push(nowStr) }) //3秒后关闭队列 gtimer.SetTimeout(time.Second*3, func() { fmt.Println("关闭队列") q.Close() }) // 消费者 不停的从队列中取值输出到终端中 for { if v := q.Pop(); v != nil { fmt.Println("消费者接收:", v) } else { break } } } 复制代码
打印结果
优势
为什么不用标准库的channel,要用gqueue呢?
- gqueue的使用比channel更灵活,channel有队列大小的限制,而gqueue队列支持动态大小
- channel的读写性能确实非常高,但是channel创建的时候需要初始化内存,初始化操作效率非常低;而gqueue的创建效率非常高,gqueue是动态创建内存。
底层实现
gqueue的底层实现是基于glist实现动态大小的特性,在队列满或者队列空时读取数据会产生阻塞。
glist是一个并发安全的链接,支持关闭并发安全的特性,当关闭并发安全的特性时和普通链表无异,在存储和读取数据时,不会产生阻塞。
阻止进程销毁
select{}的作用可以阻止进程销毁
package main import ( "fmt" "github.com/gogf/gf/container/gqueue" "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/os/gtimer" "time" ) func main() { //实例化队列 queue := gqueue.New() // 生产者每隔1秒钟向队列写入一条数据 gtimer.SetInterval(time.Second, func() { queue.Push(gtime.Now().String()) }) //消费者 常驻内存一直接收生产者的数据 for { select { case v := <-queue.C: //C是 chan interface{} if v != nil { fmt.Println("消费者:", v) } else { return } } } } 复制代码
运行结果
如下图所示,select{}可以阻止进程销毁,gtimer一直在生产数据,而for循环中的select一直在消费数据。
总结
以上就是goFrame的gqueue对比channel使用详解的详细内容,通过这篇文章,我们知道了channel的概念和作用。也知道了gqueue的底层实现和特点,以及gqueue和channel的对比。两者各有什么特点,更多关于goFrame gqueue对比channel的资料请关注猪先飞其它相关文章!
原文出处:https://juejin.cn/post/7103502362429358116
相关文章
- 队列的特性很简答,就是先进先出,一般利用数组来实现,本文就介绍了C#队列的简单使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-17
- 这篇文章主要介绍了SpringBoot集成Redis实现消息队列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 这篇文章主要介绍了c++优先队列(priority_queue)用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)
这篇文章主要介绍了C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08- 这篇文章主要介绍了Nodejs 数组的队列以及forEach的应用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25
asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了C#队列Queue用法,实例分析了队列的功能、定义及相关使用技巧,需要的朋友可以参考下...2020-06-25
- 本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下...2020-04-25
- 这篇文章主要介绍了c语言尾队列tailq使用示例,大家参考使用吧...2020-04-25
- 这篇文章主要介绍了C++循环队列实现模型,较为详细的分析了循环队列算法的原理与实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-25
- 本篇文章是对消息队列的应用进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要介绍了C#队列Queue多线程用法,实例分析了队列的相关使用技巧,需要的朋友可以参考下...2020-06-25
- 在生活中很多时候都会用到延迟队列,本文基于Redis延迟队列的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-05-13
- 在本篇文章里小编给大家整理的是一篇关于php双向队列如何理解的相关内容及实例,需要的朋友们可以跟着学习下。...2021-11-05
Node.js + Redis Sorted Set实现任务队列
本文给大家分享的是使用Node.js + Redis Sorted Set实现任务队列的方法示例,非常的实用,有需要的小伙伴可以参考下...2016-10-03- 这篇文章主要介绍了C#多线程处理多个队列数据的方法,涉及C#线程与队列的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,这篇文章主要给大家介绍了关于java固定大小队列的几种实现方式,需要的朋友可以参考下...2021-07-15
- 这篇文章主要介绍了基于JavaScript的数据结构队列动画实现示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-06
- 本篇文章是对C++无锁队列的实现进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要介绍了Go语言的队列和堆栈实现方法,涉及container/list包的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03