欢迎光临
我们一直在努力

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 出来,当获取到值的时候,进行想要的操作。

设计我们的定时任务队列

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

具体的流程如下图所示:

赞(0) 打赏
未经允许不得转载:hosteons中文网 » Go语言使用定时器实现任务队列

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册