• Go语言使用定时器实现任务队列

    Go语言中提供了两种定时器 timer 和 ticker,分别是一次性定时器和重复任务定时器。本节咱们主要介绍如何使用Go语言的定时器实现一个任务队列,非常具有实用价值。

    Go语言中定时器

    一般用法:

    package main
    
    import(
        "fmt"
        "time"
    )
    
    func main() {
        input := make(chan interface{})
        //producer - produce the messages
        go func() {
            for i := 0; i < 5; i++ {
                input <- i
            }
            input <- "hello, world"
        }()
    
        t1 := time.NewTimer(time.Second * 5)
        t2 := time.NewTimer(time.Second * 10)
    
        for {
            select {
                //consumer - consume the messages
                case msg := <-input:
                    fmt.Println(msg)
    
                case <-t1.C:
                    println("5s timer")
                    t1.Reset(time.Second * 5)
    
                case <-t2.C:
                    println("10s timer")
                    t2.Reset(time.Second * 10)
            }
        }
    }

    上面代码中的这个 C 是啥呢,我们去源码看看,以 timer 为例:

    type Timer struct {
        C <-chan Time
        r runtimeTimer
    }

    原来是一个 channel,其实有 GO 基础的都知道,GO 的运算符当出现的 -> 或者 <- 的时候,必然是有一端是指 channel。按照上面的例子来看,就是阻塞在一个 for 循环内,等待到了定时器的 C 从 channel 出来,当获取到值的时候,进行想要的操作。

    设计我们的定时任务队列

    当时的需求是这样,需要接收到客户端的请求并产生一个定时任务,会在固定时间执行,可能是一次,也可能是多次,也可能到指定时间自动停止,可能当任务终止的时候,还要能停止掉。

    具体的流程如下图所示:

更多...

加载中...