Go语言无锁队列组件的实现 (chan/interface/select)
1. 背景
go代码中要实现异步很简单,go funcName()。
但是进程需要控制协程数量在合理范围内,对应大批量任务可以使用“协程池 + 无锁队列”实现。
2. golang无锁队列实现思路
- Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。无锁队列使用带buff的chan存储数据。
- interface{} (类似c++的void*, java的Object)可以与任意类型互转。无锁队列使用interface{}作为数据存储类型。
- select可以处理多个信号, 可以用来解决channel阻塞问题。
3. 代码实现
package main
import (
"fmt"
"time"
)
type DataContainer struct {
Queue chan interface{}
}
func NewDataContainer(max_queue_len int) (dc *DataContainer){
dc = &DataContainer{}
dc.Queue = make(chan interface{}, max_queue_len)
return dc
}
//非阻塞push
func (dc *DataContainer) Push(data interface{}, waittime time.Duration) bool{
click := time.After(waittime)
select {
case dc.Queue <- data:
return true
case <- click:
return false
}
}
//非阻塞pop
func (dc *DataContainer) Pop(waittime time.Duration) (data interface{}){
click := time.After(waittime)
select {
case data =<-dc.Queue:
return data
case <- click:
return nil
}
}
//test
var MAX_WAIT_TIME = 10 *time.Millisecond
func main(){
type dataItem struct {
name string
age int
}
datacotainer := NewDataContainer(2)
//add
fmt.Printf("res=%v\n", datacotainer.Push(&dataItem{"zhangsan",25}, MAX_WAIT_TIME))
fmt.Printf("res=%v\n", datacotainer.Push(&dataItem{"lisi",30}, MAX_WAIT_TIME))
fmt.Printf("res=%v\n", datacotainer.Push(&dataItem{"wangwu",28}, MAX_WAIT_TIME))
//get
var item interface{}
item = datacotainer.Pop(MAX_WAIT_TIME)
if item != nil{
if tmp,ok := item.(*dataItem); ok{ //interface转为具体类型
fmt.Printf("item name:%v, age:%v\n", tmp.name, tmp.age)
}
}
}
Go语言无锁队列组件的实现 (chan/interface/select)的更多相关文章
- Erlang运行时中的无锁队列及其在异步线程中的应用
本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang ...
- 【DPDK】【ring】从DPDK的ring来看无锁队列的实现
[前言] 队列是众多数据结构中最常见的一种之一.曾经有人和我说过这么一句话,叫做“程序等于数据结构+算法”.因此在设计模块.写代码时,队列常常作为一个很常见的结构出现在模块设计中.DPDK不仅是一个加 ...
- 无锁队列以及ABA问题
队列是我们非常常用的数据结构,用来提供数据的写入和读取功能,而且通常在不同线程之间作为数据通信的桥梁.不过在将无锁队列的算法之前,需要先了解一下CAS(compare and swap)的原理.由于多 ...
- CAS简介和无锁队列的实现
Q:CAS的实现 A:gcc提供了两个函数 bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)// ...
- java轻松实现无锁队列
1.什么是无锁(Lock-Free)编程 当谈及 Lock-Free 编程时,我们常将其概念与 Mutex(互斥) 或 Lock(锁) 联系在一起,描述要在编程中尽量少使用这些锁结构,降低线程间互相阻 ...
- 锁、CAS操作和无锁队列的实现
https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...
- zeromq源码分析笔记之无锁队列ypipe_t(3)
在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...
- boost 无锁队列
一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...
随机推荐
- windows云服务器数据迁移
刚入职,第一个任务是完成windows腾讯云到windows华为云上的MySQL数据库迁移.之前都是在CentOS上搞,感觉没啥难度,一口答应,没想到各种坑接踵而来.次数不再叙述坑都有哪些了,说说怎么 ...
- jenkins使用教程之系统设置
如果jenkins环境还没有搭建好的话可以看这篇文章点击查看 进入jenkins首页,点击系统管理 点击系统设置,进入系统设置界面 1.主目录,点击高级 主目录是存放Jenkins所有的文件的,工作空 ...
- BZOJ3796 Mushroom追妹纸 字符串 SA KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/9253173.html 题目传送门 - BZOJ3796 题意 找一个串 $w$ 满足: 1.$w$ 是 $s_ ...
- CentOS7 Windows双系统 修复引导
伪前提:先装Windows再装CentOS7(伪前提是因为没试过先装CentOS再装Windows) Windows用U盘安装CentOS7后,开启启动项里面仅有CentOS7的启动项,要修复Wind ...
- Codeforces 1036C Classy Numbers 【DFS】
<题目链接> 题目大意: 对于那些各个位数上的非0数小于等于3的数,我们称为 classy number ,现在给你一个闭区间 [L,R] (1≤L≤R≤1018).,问你这个区间内有多 ...
- XXL-JOB原理--定时任务框架简介(一)
https://blog.csdn.net/qq924862077/article/details/82595948 https://blog.csdn.net/qq924862077/article ...
- 222. Getter与Setter
Description Implement a class School, including the following attributes and methods: A private attr ...
- 765. 有效的三角形.md
描述 给出三个整数 a, b, c, 如果它们可以构成三角形,返回 true. 三角形的定义 (Wikipedia) 样例 给定 a = 2, b = 3, c = 4 返回 true 给定 a = ...
- MySQL firstmatch strategy
在探讨subquery如 x IN (SELECT XX FROM TABLE)这样的形式的MATCH策略时,不是很清楚实现过程.在网上搜了一下, 地址:http://stackoverflow.co ...
- 潭州课堂25班:Ph201805201 django 项目 第三十八课 后台 文章发布,FastDFS安装 配置(课堂笔记)
, .安装FastDFS # 从docker hub中拉取fastdfs镜像docker pull youkou1/fastdfs # 查看镜像是否拉取成功docker images # 安装trac ...