在主程序启动的时候开一个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 }
备注:消费者要一直循环,且创建的管道需要加缓冲