打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
golang 超时队列实现与使用

超时队列

目前业务上需要一个速度快,数据超时删除的内存队列,实现和使用如下:

package  mainimport (	queue "github.com/fwhezfwhez/go-queue"	"fmt")func main() {    //初始化,init    q:= queue.NewEmpty()    //压入,push    q.Push(5)    q.Push(4)    //打印,print    q.Print()    //出列,pop    fmt.Println(q.Pop())    //打印,print    q.Print()    //长度,len    fmt.Println(q.Length())    //并发安全压入,currently safe push    q.SafePush(6)    //并发安全出列,currently safe pop    fmt.Print(q.SafePop())    q.Print()    // time queue    tq := queue.TimeQueueWithTimeStep(10*time.Second, 50, 1*time.Nanosecond)    tq.StartTimeSpying()    tq.TPush(5)    tq.SafeTPush(6)    fmt.Println("init:")    tq.Print()    time.Sleep(5 * time.Second)    fmt.Println("after 5s:")    tq.Print()    time.Sleep(9 * time.Second)    fmt.Println("after 14s")    tq.Print()}

协程超时管理

// start to spy on queue's time-out data and throw itfunc (q *Queue) StartTimeSpying() {	fmt.Println("time supervisor starts")	go q.startTimeSpying()}// detail of StartTimeSpying functionfunc (q *Queue) startTimeSpying() error {	var err = make(chan string, 0)	go func(queue *Queue, er chan string) {		fmt.Println("start time spying, data in the queue can stay for "   q.ExpireAfter.String())		for {			if queue.timeSpy == false {				err <- "spying routine stops because: queue's timeSpy is false, make sure the queue is definition by q=TimeQueue(time.Duration,int)"				return			}			select {			case <-queue.flag:				fmt.Println("time spy executing stops")				return			default:				fmt.Print()			}			ok,er:=queue.timingRemove()			if er!=nil{				err <- er.(errorx.Error).StackTrace()			}			if ok {				time.Sleep(queue.timeStep)			}		}	}(q, err)	select {	case msg := <-err:		fmt.Println("time spy supervisor accidentally stops because: ",msg)		return errorx.NewFromString(msg)	case <-q.flag:		fmt.Println("time spy supervisor stops")		return nil	}}// remove those time-out datafunc (q *Queue) timingRemove() (bool,error) {	if len(q.Data) <1 {		return true,nil	}	head, index, er := q.THead()	if er != nil {		return false, errorx.Wrap(er)	}	if index < 0 {		return false, errorx.NewFromString("queue'length goes 0")	}	now := time.Now().Unix()	created := time.Unix(head.CreatedAt, 0)	//fmt.Println("now:",now)	//fmt.Println("expire:",created.Add(q.ExpireAfter).Unix())	if created.Add(q.ExpireAfter).Unix() < now {		// out of time		_,_,e := q.TPop()		if e!=nil {			return false, errorx.Wrap(e)		}		if len(q.Data) >0 {			return q.timingRemove()		}else{			return true,nil		}	} else{		return true ,nil	}}
来源:http://www.icode9.com/content-4-27871.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ
iOS开发多线程之总结篇(常见用法、常用方法)
C++任务队列与多线程
基于Redis实现分布式消息队列
docker快速安装rabbitmq
使用Golang开发微信公众平台
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服