go语言设置定时器的方法

go语言设置定时器的方法:1、通过“time.NewTicker()”方法创建,其中ticker会按照设定的间隔时间触发;2、通过“time.NewTimer()”方法创建,其中timer只会执行一词;3、使用“After()”来创建。

Go语言中定时器的使用

GO语言在time包中提供了三种定时器的使用方式:

1.第一种:ticker

// A Ticker holds a channel that delivers `ticks' of a clock
// at intervals.
type Ticker struct {
	C <-chan Time // The channel on which the ticks are delivered.
	r runtimeTimer
}

通过 time.NewTicker() 创建,这种类型,ticker会不断的按照设定的间隔时间触发,除非主动终止运行。

2.第二种:timer

// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
	C <-chan Time
	r runtimeTimer
}

通过 time.NewTimer() 创建,这种类型,timer只会执行一次,当然,可以在执行完以后通过调用 timer.Reset() 让定时器再次工作,并可以更改时间间隔。

3.第三种:After()

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

从代码可以看到,After()其实是Timer的一个语法糖。


下面通过代码演示一下三种方式的使用:

1.Ticker

ticker := time.NewTicker(time.Second * 1) // 运行时长
    ch := make(chan int)
    go func() {
        var x int
        for x < 10 {
            select {
            case <-ticker.C:
                x++
                fmt.Printf("%d\n", x)
            }
        }
        ticker.Stop()
        ch <- 0
    }()
    <-ch                                    // 通过通道阻塞,让任务可以执行完指定的次数。

该ticker每1秒触发一次,即ticker.C中每一秒会有一个内容加入,最后通过向ch中写入数字,让程序解除阻塞,继续执行。

2.Timer

timer := time.NewTimer(time.Second * 1) // timer 只能按时触发一次,可通过Reset()重置后继续触发。
    go func() {
        var x int
        for {
            select {
            case <-timer.C:
                x++
                fmt.Printf("%d,%s\n", x, time.Now().Format("2006-01-02 15:04:05"))
                if x < 10 {
                    timer.Reset(time.Second * 2)
                } else {
                    ch <- x
                }
            }
        }
    }()
    <-ch

3.After()

// 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")

4.我们可以利用这些基本的方法,设计自己的定时任务管理。

type jobFunc2 func(j *job)

type job struct {
    jf     jobFunc2
    params map[string]interface{}
    ch     chan int
}

func NewJob() *job {
    return &job{
        params: make(map[string]interface{}),
        ch:     make(chan int),
    }
}

func (j *job) Run(t time.Duration) {
    ticker := time.NewTicker(time.Second * t)
    go func() {
        for {
            select {
            case <-ticker.C:
                j.jf(j)
            case <-j.ch:
                fmt.Println("收到结束指令")
                ticker.Stop()
                break
            }
        }
    }()

}

func main() {
    j := NewJob()
    j.jf = func(jj *job) {
        fmt.Println("定时任务执行...", time.Now().Format("15:04:05 2006-02-01"), jj.params)
    }
    j.params["p1"] = "第一个参数"
    j.params["p2"] = 100
    j.Run(1)

    // 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")
}

部分执行结果截图:

go语言设置定时器的方法

最后补充一下,通过channel去终止任务的执行。

// 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")
    j.ch <- 0
    <-time.After(time.Second * 2)
    fmt.Println("又等了2秒钟...这两秒钟可以看到 tt 没干活了...")

go语言设置定时器的方法

在GO语言编写中,要熟练使用 channel

原创文章,作者:VYANY,如若转载,请注明出处:https://www.beidanyezhu.com/a/26798.html

(0)
VYANY的头像VYANY
上一篇 2025-01-05 11:50:27
下一篇 2025-01-05

相关推荐

  • go语言可以用哪些框架

    go语言使用的框架有:1、Beego框架;2、Buffalo框架;3、Echo框架;4、Gin框架;5、Iris框架;6、Revel框架。 6款好用的go语言web框架: Beeg…

  • go语言怎么引入包

    go语言引入包的方法:可以直接使用【import "包名"】来引入一个包。如果需要同时引入多个包,可以使用【import {"包名" &qu…

    2025-01-07
  • go语言有什么开发工具

    go语言开发工具有:1、GoLand;2、LiteIDE;3、Eclipse。LiteIDE是一款开源、跨平台的轻量级Go语言集成开发环境。 开发工具介绍: 1、GoLand Go…

    2025-01-07
  • vscode如何配置go语言开发环境

    Golang 环境配置 1) 首先下载适合你系统的安装包 2)下载完成安装到指定目录即可。我这里是(D:\Go)。 3)配置Glang环境变量 进入我的电脑->高级设置-&g…

    2025-01-07
  • go语言defer怎么用

    go语言defer的用法:1、defer语句在函数返回之前或函数中的return语句之后执行;2、多个defer语句的执行顺序是逆序执行;3、在panic语句后的defer语句不执…

  • windows下如何搭建go语言开发环境

    windows下搭建go语言开发环境的方法:1、在官网下载go语言开发包;2、安装go语言开发包;3、设置GOPATH环境变量;4、测试go开发包是否安装成功。 具体步骤如下: 一…

    2025-01-07
  • go语言的7大优势是什么

    go语言的优势有:1、学习曲线容易;2、开发效率和运行效率高;3、自由高效;4、拥有强大的标准库;5、部署方便;6、高度支持并发性;7、稳定性高。 go语言的优势: 1、学习曲线容…

  • go语言指的是什么

    go语言是一种静态强类型、编译型语言,它的语法与C语言相近。go语言规定每行程序结束后不需要撰写分号,大括号不能够换行放置,if判断式和for循环不需要以小括号包裹。 详细介绍: …

  • go语言适合于什么领域

    go语言适用的领域有:1、服务器编程;2、分布式系统;3、网络编程;4、内存数据库;5、云平台;6、游戏服务端的开发。go语言是一种静态强类型、编译型语言。 Go(又称 Golan…

  • yum如何安装go语言

    yum安装go语言的方法:首先执行【yum -y install golang】命令安装go;然后编辑profile文件,配置环境变量;最后执行【source /etc/profi…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部