生产者消费者模式做一个golang的定时器

在主程序启动的时候开一个goroutine作为消费者,用管道连接生产者和消费者,消费者处于无限循环,从管道中获取channel传过来定时event

注意:channel在消费者创建的时候就连通生产者和消费者

结构图大体如上

消费者代码:

消费者处于无限循环,在循环中拿到Eventchan传过来的数据,再通过select调度chan,进行业务操作

import (
	
	"fmt"
)

type Event struct {
	Id int64
	State string
}
var Eventchan= make(chan Event,1)//加缓冲
func Watch(){
	for {
	  select {
		case t := <-Eventchan:
		id := t.Id
		state := t.State
		var result dao.Homework			
          dao.DB(dao.HomeworkTable).Select("correct_status").Where("id = ?",id).Find(&result)
		if result.CorrectStatus =="DONE"{
          
          }else if result.CorrectStatus=="DOING"{
		  if state == "TIMEOUT" {
			service.ChangeStatus(id)
		    }
		   if state == "END" {
			service.ChangeDone(id)
		   }
		}
		default:

		}

	}
}

  

生产者代码如下:

生产者创建一个定时器,在定时器完成之后把要传的数据放入Eventchan,消费者从Eventchan中获取数据进行业务操作

func Commentstart(c *gin.Context){
	id := c.MustGet("homeworkId").(int64)
	service.Commentstart(id)
	tc := time.NewTicker(time.Second * 10)//定时器
	
        go reseles(tc,id)
	
c.JSON(http.StatusOK,gin.H{
		"result":"DOING",
	})

}


func reseles(time *time.Ticker,id int64) {
	<-time.C
	t := walker.Event{id, "TIMEOUT"}
	
	walker.Eventchan<-t
}    

备注:消费者要一直循环,且创建的管道需要加缓冲

原文地址:https://www.cnblogs.com/luffe/p/8657266.html