go的timer定时器实现

示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package main

  

import (

    "fmt"

    "time"

)

  

func testTimer1() {

    go func() {

        fmt.Println("test timer1")

    }()

  

}

  

func testTimer2() {

    go func() {

        fmt.Println(time.Now().String())

    }()

}

  

func timer1() {

    timer1 := time.NewTicker(1 * time.Second)

    for {

        select {

        case <-timer1.C:

            testTimer1()

        }

    }

}

  

func timer2() {

    timer2 := time.NewTicker(5 * time.Second)

    for {

        select {

        case <-timer2.C:

            testTimer2()

        }

    }

}

  

func main() {

   go  timer1()

        timer2()

}

运行结果截屏如下:

  

看go的time部分源码 Ticker结构 

1

2

3

4

5

6

7

type Ticker struct {

C <-chan Time // The channel on which the ticks are delivered.

r runtimeTimer

}

  

go的time和ticket的调用

或者叫timmer internal和其他语言的开发思路不一样。

其他语言,多是注册回调函数,定时,时间到了调用回调。

go是 通过 chan

的阻塞实现的。

调用的地方,读取chan 

定时,时间到,向chan写入值,阻塞解除,调用函数

猜你喜欢

转载自blog.csdn.net/anran186/article/details/88059868