go语言标准库里的定时器使用场景

simamengde · · 495 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

(1)time.NewTimer,time.NewTicker,time.Tick的使用如下:

package main
 
import (
    "errors"
    "fmt"
    "golang.org/x/sync/errgroup"
    "time"
)
 
/**
* ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。
* timer定时器,是到固定时间后值只会执行一次
* 如果timer定时器要每隔间隔的时间执行,实现ticker的效果,使用 func (t *Timer) Reset(d Duration) bool
 */
func main() {
    var g errgroup.Group
 
    g.Go(func() error {
        timer := time.NewTimer(1 * time.Second)
 
        for {
            select {
            case <-timer.C:
                println("1_Tokyo_NewYork_London")
                timer.Reset(1 * time.Second)
                // 若要停止定时器就使用如下代码,这样会释放资源
                // timer.Stop()
            }
            // break
        }
 
        return nil
    })
 
    g.Go(func() error {
        ticker := time.NewTicker(1 * time.Second)
 
        for {
            select {
            case <-ticker.C:
                println("2_NewYork_London_Tokyo")
                // 若要停止定时器就使用如下代码,这样会释放资源
                // ticker.Stop()
            }
            // break
        }
 
        return errors.New("sgdagf")
    })
    // 上一个协程实现的功能一样的,但这time.Tick无法停止,也就是无法释放资源!
    g.Go(func() error {
        for {
            select {
            case <-time.Tick(1 * time.Second):
                println("3_Singapore_London_Tokyo")
            }
 
            // fmt.Println(<-time.Tick(2 * time.Second))
        }
    })
 
    if err := g.Wait(); err != nil {
        fmt.Println("Err:",err)
    } else {
        println("finish")
    }
}

(2)time.AfterFunc使用如下:

package main
 
import "time"
 
func main() {
    f := func() { println("Tokyo_London_NewYork") }
    // AfterFunc的内部又启动了一个协程,且这个定时器到了定时时间后,只会执行一次!
    time.AfterFunc(2*time.Second, f)
    time.Sleep(5 * time.Second)
}

下面这个情况会发生死锁!

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    fmt.Println(time.Now())
    f := func() { println("Tokyo_London_NewYork") }
    // 执行下面的代码,会发生死锁!
    fmt.Println(<-time.AfterFunc(2*time.Second, f).C)
}

(3)time.After使用如下:

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    fmt.Println("3 second before:",time.Now())
    // After函数到了定时时间后只有执行一次!并且返回过了定时时间后的当前时间!
    fmt.Println("3 second after:",    <-time.After(3*time.Second))
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:simamengde

查看原文:go语言标准库里的定时器使用场景

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

495 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传