个人网站需要哪些内容,毕业设计在线交流平台,网站内部链接有什么作用,自己网站建设容易吗实现延迟消息具体思路我是看的下面这篇文章https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ实现延迟消息最主要的两个结构#xff1a;环形队列#xff1a;通过golang中的数组实现#xff0c;分成3600个slot。任务集合#xff1a;通过map[key]*Task#xff0c;每个slot…实现延迟消息具体思路我是看的下面这篇文章https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ实现延迟消息最主要的两个结构环形队列通过golang中的数组实现分成3600个slot。任务集合通过map[key]*Task每个slot一个mapmap的值就是我们要执行的任务。原理图如下实现代码如下package main;import (timeerrorsfmt)//延迟消息type DelayMessage struct {//当前下标curIndex int;//环形槽slots [3600]map[string]*Task;//关闭closed chan bool;//任务关闭taskClose chan bool;//时间关闭timeClose chan bool;//启动时间startTime time.Time;}//执行的任务函数type TaskFunc func(args ...interface{});//任务type Task struct {//循环次数cycleNum int;//执行的函数exec TaskFunc;params []interface{};}//创建一个延迟消息func NewDelayMessage() *DelayMessage {dm : DelayMessage{curIndex: 0,closed: make(chan bool),taskClose: make(chan bool),timeClose: make(chan bool),startTime: time.Now(),};for i : 0; i 3600; i {dm.slots[i] make(map[string]*Task);}return dm;}//启动延迟消息func (dm *DelayMessage) Start() {go dm.taskLoop();go dm.timeLoop();select {case {dm.taskClose dm.timeClose break;}};}//关闭延迟消息func (dm *DelayMessage) Close() {dm.closed }//处理每1秒的任务func (dm *DelayMessage) taskLoop() {defer func() {fmt.Println(taskLoop exit);}();for {select {case {return;}default:{//取出当前的槽的任务tasks : dm.slots[dm.curIndex];if len(tasks) 0 {//遍历任务判断任务循环次数等于0则运行任务//否则任务循环次数减1for k, v : range tasks {if v.cycleNum 0 {go v.exec(v.params...);//删除运行过的任务delete(tasks, k);} else {v.cycleNum--;}}}}}}}//处理每1秒移动下标func (dm *DelayMessage) timeLoop() {defer func() {fmt.Println(timeLoop exit);}();tick : time.NewTicker(time.Second);for {select {case {return;}case {fmt.Println(time.Now().Format(2006-01-02 15:04:05));//判断当前下标如果等于3599则重置为0否则加1if dm.curIndex 3599 {dm.curIndex 0;} else {dm.curIndex;}}}}}//添加任务func (dm *DelayMessage) AddTask(t time.Time, key string, exec TaskFunc, params []interface{}) error {if dm.startTime.After(t) {return errors.New(时间错误);}//当前时间与指定时间相差秒数subSecond : t.Unix() - dm.startTime.Unix();//计算循环次数cycleNum : int(subSecond / 3600);//计算任务所在的slots的下标ix : subSecond % 3600;//把任务加入tasks中tasks : dm.slots[ix];if _, ok : tasks[key]; ok {return errors.New(该slots中已存在key为 key 的任务);}tasks[key] Task{cycleNum: cycleNum,exec: exec,params: params,};return nil;}func main() {//创建延迟消息dm : NewDelayMessage();//添加任务dm.AddTask(time.Now().Add(time.Second*10), test1, func(args ...interface{}) {fmt.Println(args...);}, []interface{}{1, 2, 3});dm.AddTask(time.Now().Add(time.Second*10), test2, func(args ...interface{}) {fmt.Println(args...);}, []interface{}{4, 5, 6});dm.AddTask(time.Now().Add(time.Second*20), test3, func(args ...interface{}) {fmt.Println(args...);}, []interface{}{hello, world, test});dm.AddTask(time.Now().Add(time.Second*30), test4, func(args ...interface{}) {sum : 0;for arg : range args {sum arg;}fmt.Println(sum : , sum);}, []interface{}{1, 2, 3});//40秒后关闭time.AfterFunc(time.Second*40, func() {dm.Close();});dm.Start();}测试结果如下