zoukankan      html  css  js  c++  java
  • 生产者消费者模式做一个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
    }    
    

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

  • 相关阅读:
    一秒解决element容器布局显示内部调节框的问题
    操作管理员
    Linux_网络基础管理
    如何解决在WordPress安装Redis插件时需要输入FTP问题?
    如何在我的EC2实例状态更改时获取自定义电子邮件通知
    利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶
    源码安装Apache(httpd)
    Linux_源码安装包管理理论概述
    Linux_yum命令详解
    Linux_yum仓库管理
  • 原文地址:https://www.cnblogs.com/luffe/p/8657266.html
Copyright © 2011-2022 走看看