成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言一次性定時器使用方式和實現原理

開發 前端
本文我們介紹 Go 語言標準庫 time? 包提供的一次性定時器 Timer,不僅介紹了它的使用方式,還介紹了它的實現原理。

?1.介紹

在 Go 語言標準庫 time? 包中的 Timer 類型,它是表示單一事件的計時器,也就是說它是一次性定時器。

在 Go 語言項目開發中,定時器使用廣泛,本文我們介紹 Go 語言中怎么使用 Timer,以及它的實現原理。

2.使用方式

使用 Timer? 一次性定時器,需要導入 time 包,創建定時器的方式有兩種,分別是:

func NewTimer(d Duration) *Timer

使用 func NewTimer? 創建 Timer?,入參是定時器的等待時間,時間到達時,發送當前時間到 channel中。

示例代碼:

func main() {
nowTime := time.Now().Unix()
fmt.Println(nowTime)
NewTimerDemo()
}

func NewTimerDemo() {
timer := time.NewTimer(2 * time.Second)
select {
case <-timer.C:
currentTime := time.Now().Unix()
fmt.Println(currentTime, "do something")
}
}

輸出結果:

1665894136
1665894138 do something

通過閱讀上面這段代碼,我們可以發現我們定義了一個 2s? 后執行的定時器 timer?,然后使用 select? 讀取 timer.C 中的數據,當讀取到數據時,執行特定業務邏輯代碼。

func AfterFunc(d Duration, f func()) *Timer

使用 func AfterFunc? 創建 Timer,入參是定時器等待時間,和時間到達時執行的函數。

示例代碼:

func main() {
nowTime := time.Now().Unix()
fmt.Println(nowTime)
AfterFuncDemo()
}

func AfterFuncDemo() {
time.AfterFunc(2 * time.Second, func() {
currentTime := time.Now().Unix()
fmt.Println(currentTime, "do something")
})
time.Sleep(3 * time.Second)
}

閱讀上面這段代碼,細心的讀者朋友們可能已經發現,我們在代碼末尾使用 time.Sleep()?,這是因為 time.AfterFunc() 是異步執行的,所以需要等待協成退出。

3.實現原理

我們在源碼中查看 Timer? 的數據結構,發現它包含兩個字段,其中一個是可導出字段 C?,這是一個 Time?類型的 chan?;另一個是不可導出字段 r?,這是一個 runtimeTimer 類型。

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

實際上,每個 Go 應用程序底層都會有一個特定的協程管理 Timer?,該協程(底層協程)監控到某個 Timer? 指定的時間到達時,就會將當前時間發送到 C? 中,然后上層讀取到 C 中的數據時,執行相關業務邏輯代碼。

底層協程監控 Timer? 的 r? 字段中的數據,我們在源碼中查看一下 runtimeTimer 的數據結構:

type runtimeTimer struct {
tb uintptr
i int
when int64
period int64
f func(interface{}, uintptr)
arg interface{}
seq uintptr
}

閱讀上面這段代碼,我們可以發現 runtimeTimer? 中包含的所有字段,我們重點了解 when、f? 和 arg。

  • when:定時器執行時間。
  • f:定時器執行的回調函數。
  • arg:定時器執行的回調函數的參數。

在簡單了解 Timer? 的數據結構之后,我們在源碼中查看一下 func NewTimer 的代碼:

// NewTimer creates a new Timer that will send
// the current time on its channel after at least duration d.
func NewTimer(d Duration) *Timer {
c := make(chan Time, 1)
t := &Timer{
C: c,
r: runtimeTimer{
when: when(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}

閱讀上面這段代碼,我們可以發現 func NewTimer? 的實現非常簡單,它實際上就是構造了一個 Timer?,然后把 Timer.r? 傳參給 startTimer()?,除了 startTimer()? 函數外,還有兩個函數,分別是 when()?和 sendTime?,其中 when()? 是計算計時器的執行時間,sendTime 是計時器時間到達時執行的事件(實際上就是將當前時間寫入通道中)。

sendTime 源碼:

func sendTime(c interface{}, seq uintptr) {
// Non-blocking send of time on c.
// Used in NewTimer, it cannot block anyway (buffer).
// Used in NewTicker, dropping sends on the floor is
// the desired behavior when the reader gets behind,
// because the sends are periodic.
select {
case c.(chan Time) <- Now():
default:
}
}

我們已經了解到,func NewTimer? 將構造的 Timer.r? 傳參給 startTimer()?,它負責把 runtimeTimer?寫入底層協程的數組中(如果底層協程未運行,它將會啟動底層協程),將 Timer? 交給底層協程監控,也就是上面講到的,當底層協程監控到某個 Timer 指定時間到達時,將當前時間發送到它的通道中。

// startTimer adds t to the timer heap.
//go:linkname startTimer time.startTimer
func startTimer(t *timer) {
if raceenabled {
racerelease(unsafe.Pointer(t))
}
addtimer(t)
}

4.總結

本文我們介紹 Go 語言標準庫 time? 包提供的一次性定時器 Timer,不僅介紹了它的使用方式,還介紹了它的實現原理。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2024-04-03 09:00:10

2023-09-26 07:11:15

KubernetesJob節點

2022-10-24 00:48:58

Go語言errgroup

2014-03-06 15:16:18

安全管理linux安全

2010-11-24 16:32:50

2013-04-17 09:16:37

2024-02-28 08:18:13

Java日志項目

2014-08-04 14:38:25

LinuxToken

2021-08-12 09:48:21

Webpack Loa工具Webpack

2019-08-06 09:21:45

2025-05-23 10:00:00

網絡交換機STP

2021-09-02 07:26:27

Django 驗證碼Framework

2012-09-18 15:04:31

Office 2013微軟

2009-12-25 14:46:53

Windows 7文件關聯

2017-03-13 09:24:59

概念學習器學習字符

2021-07-26 09:56:19

AI 數據人工智能

2012-02-01 16:48:54

后門Putty

2011-04-18 13:36:42

2020-05-28 08:29:54

目錄腳本測試

2020-11-02 13:44:56

CentOSK8SLinux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美在线观看 | 日韩视频一区在线观看 | 亚洲国产成人精品女人久久久 | 国产精品一区二区在线 | 成人在线视频一区 | 欧美激情欧美激情在线五月 | 国产一区日韩在线 | 国产中文区二幕区2012 | 成人av在线大片 | 中文字幕在线人 | 91精品www| 国产丝袜人妖cd露出 | 观看av| 91精品一区二区三区久久久久 | 国产精品污www一区二区三区 | 亚洲自拍偷拍免费视频 | 欧美久久精品 | 亚洲va国产日韩欧美精品色婷婷 | 欧美天堂 | www.久久精品视频 | 久久久久久99 | 久久久久久国产精品久久 | 精品一二三区在线观看 | 亚洲美女一区 | 欧美一级片在线观看 | 午夜爽爽男女免费观看hd | 亚洲精品国产第一综合99久久 | 国产精品污www在线观看 | 亚洲女优在线播放 | 天天躁日日躁aaaa视频 | 国产乱肥老妇国产一区二 | 操久久| www.亚洲.com| 成人影院在线观看 | 日韩视频一区 | 中文字幕av亚洲精品一部二部 | 欧美激情在线精品一区二区三区 | 亚洲成人精品在线 | 日韩av在线一区 | 麻豆av在线免费观看 | 一区二区不卡高清 |