Golang 定时器和定时触发教程

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验重点介绍Go语言中定时器(timer)和定时触发(ticker)的使用。定时器和定时触发对于在特定时间执行代码或按给定间隔重复执行代码很有用。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/timers("Timers") subgraph Lab Skills go/timers -.-> lab-15524{{"Golang 定时器和定时触发教程"}} end

定时器

本实验要求实现一个定时器,它能等待指定的持续时间,然后触发。此外,该定时器应在触发前可取消。

  • 应导入 time 包。
  • 应创建两个定时器,一个等待2秒,另一个等待1秒。
  • 第一个定时器触发时应打印 “Timer 1 fired”。
  • 第二个定时器触发时应打印 “Timer 2 fired”。
  • 第二个定时器应在触发前取消。
  • 程序应等待2秒,以表明第二个定时器未触发。
// 第一个定时器将在我们启动程序后约2秒触发,但第二个定时器应在有机会触发之前停止。
$ go run timers.go
Timer 1 fired
Timer 2 stopped

以下是完整代码:

// 我们常常希望在未来的某个时刻执行Go代码,或者以一定的间隔重复执行。Go语言内置的
// _定时器_ 和 _定时触发_ 功能使这两项任务都变得轻松。我们先来看定时器,然后再看
// [定时触发](tickers)。

package main

import (
	"fmt"
	"time"
)

func main() {

	// 定时器表示未来的一个单一事件。你告诉定时器你要等待多长时间,它会提供一个通道,
	// 在那个时候会收到通知。这个定时器将等待2秒。
	timer1 := time.NewTimer(2 * time.Second)

	// `<-timer1.C` 会阻塞在定时器的通道 `C` 上,直到它发送一个值,表示定时器已触发。
	<-timer1.C
	fmt.Println("Timer 1 fired")

	// 如果你只是想等待,你可以使用 `time.Sleep`。定时器可能有用的一个原因是,你可以
	// 在定时器触发前取消它。下面是一个例子。
	timer2 := time.NewTimer(time.Second)
	go func() {
		<-timer2.C
		fmt.Println("Timer 2 fired")
	}()
	stop2 := timer2.Stop()
	if stop2 {
		fmt.Println("Timer 2 stopped")
	}

	// 给 `timer2` 足够的时间来触发(如果它本来会触发的话),以表明它实际上已停止。
	time.Sleep(2 * time.Second)
}

总结

本实验展示了Go语言中定时器的使用。定时器可用于在特定时间执行代码,或在执行代码前等待指定的持续时间。此外,定时器在触发前可以取消。