Golang time.Sleep()函数及示例

Golang time.Sleep()函数及示例

介绍

time.Sleep()是Golang中一个非常重要的函数。它可以让程序暂停一段时间,让CPU再去运行其他的任务。这个函数在网络编程、定时器和一些需要延迟执行的任务中非常有用。

格式

time.Sleep()的函数格式如下:

func Sleep(d Duration)

其中,参数d为时间段数值,单位为纳秒。Duration是Go标准库定义的一个类型,声明如下:

type Duration int64

它代表一段时间间隔(以纳秒为单位),可以是负数或正数,可以超出int64数值类型的范围。我们可以使用常量或运算表达式创建Duration类型的变量。

示例

下面是一些使用time.Sleep()的示例代码:

示例1:休息5秒钟

package main

import (
    "fmt"
    "time"
)

func main() {
    start := time.Now()
    fmt.Println("开始休息:", start)

    time.Sleep(5 * time.Second)

    end := time.Now()
    fmt.Println("休息结束:", end)
    fmt.Println("休息了", end.Sub(start))
}

在上面的代码中,首先使用time.Now()获取当前时间,然后执行time.Sleep(5 * time.Second)函数,让程序暂停5秒钟。最后,再次使用time.Now()获取当前时间,从而计算出程序休息的时间。运行结果如下:

开始休息: 2021-08-01 15:04:47.904051 +0800 CST m=+0.000252598
休息结束: 2021-08-01 15:04:52.904587 +0800 CST m=+5.000789245
休息了 5s

代码中的time.SecondDuration类型的常量,代表1秒钟(1000000000纳秒)。在time.Sleep()函数中,5 * time.Second表示休息5秒钟。

示例2:阻塞主线程

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("开始")

    time.Sleep(10)

    fmt.Println("结束")
}

细心的朋友可能会发现,上面的代码中time.Sleep()的参数没有加任何单位,原因是在Go语言中,对于无单位的时间,被默认解析为纳秒。这段代码在执行时会阻塞主线程10纳秒,即使没有其他任务,CPU也无法去执行程序的其他部分。运行结果如下:

开始
结束

代码中的10代表10纳秒。

示例3:定时器

package main

import (
    "fmt"
    "time"
)

func main() {
    timer1 := time.NewTimer(2 * time.Second)

    <-timer1.C

    fmt.Println("Timer 1 expired")
}

在上面的代码中,我们使用了time.NewTimer()函数来创建一个定时器,它会在2秒钟后触发。然后通过读取timer1.C的通道来等待定时器的事件到来。当定时器到时间时,程序将输出Timer 1 expired。运行结果如下:

Timer 1 expired

示例4:周期性任务

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(500 * time.Millisecond)

    done := make(chan bool)
    go func() {
        for {
            select {
            case <- done:
                return
            case t := <- ticker.C:
                fmt.Println("Tick at ", t)
            }
        }
    }()

    time.Sleep(1600 * time.Millisecond)
    ticker.Stop()
    done <- true
    fmt.Println("Ticker stopped")
}

在上面的代码中,我们使用time.NewTicker()函数创建了一个定时器ticker,它每500毫秒会触发一次,不断循环,执行定时任务。在go func()中,我们使用了select语句来依次监控两个管道,一个是定时器的通道ticker.C,一个是done管道,当done管道中有数据时,说明任务结束,需要退出循环。而当ticker.C管道中有数据时,说明定时器到时间了,进行周期之间的任务处理。

运行结果如下:

Tick at  2021-08-01 15:35:56.788502 +0800 CST m=+0.500065401
Tick at  2021-08-01 15:35:57.288301 +0800 CST m=+1.000865267
Tick at  2021-08-01 15:35:57.788353 +0800 CST m=+1.500916971
Ticker stopped

代码中的time.NewTicker()函数返回的是Ticker类型的结构体,与之前的Timer类型类似。不同的是,Ticker类型有一个C通道,用于发送时间事件。在这个示例中,定时器每500毫秒会向这个通道中写入一次时间事件。而在select语句中,我们使用了case t := <-ticker.C来处理定时器事件,并在输出时使用了t来表示时间戳。

结论

通过本文,我们了解了Golang中重要的函数time.Sleep()的基本介绍、格式、用法和示例代码。我们可以使用time.Sleep()来制定一定的延时,或者实现更高级的任务处理功能,如定时器或周期性任务等。在实际编写代码时,需要灵活运用这种函数,以确保程序的正确性和高效性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程