четверг, 23 июля 2020 г.

Пакет time в Golang, функции After, Sleep, Tick

Функция After

func After(d Duration) <-chan Time

After ожидает истечения продолжительности d, а затем отправляет текущее время по возвращаемому каналу. Это эквивалентно NewTimer(d).C. Базовый Timer не восстанавливается сборщиком мусора, пока таймер не истекет. Если важна эффективность, используйте вместо нее NewTimer и вызовите Timer.Stop, если таймер больше не нужен.

Привет использования After

package main

import (
    "fmt"
    "time"
)

var c chan int

func handle(int) {}

func main() {
    select {
    case m := <-c:
        handle(m)
    case <-time.After(3 * time.Second):
        fmt.Println("timed out")
    }
}

Вывод (после 3 секунд от запуска):

timed out

Функция Sleep

func Sleep(d Duration)

Sleep приостанавливает текущую goroutine как минимум на время d. Отрицательная или нулевая продолжительность приводит к немедленному возвращению Sleep.

Пример использования Sleep

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Старт")
    time.Sleep(3000 * time.Millisecond)
    fmt.Println("Финиш")
}

Вывод:

Старт
Финиш

Функция Tick

func Tick(d Duration) <-chan Time

Tick - это удобная оболочка для NewTicker, предоставляющая доступ только к тиковому каналу. Хотя Tick полезен для клиентов, которым нет необходимости выключать Ticker, имейте в виду, что без способа выключить его базовый Ticker не может быть восстановлен сборщиком мусора; это "утечки". В отличие от NewTicker, Tick вернет nil, если d <= 0.

Пример использования Tick

package main

import (
    "fmt"
    "time"
)

func statusUpdate() string { return "" }

func main() {
    c := time.Tick(5 * time.Second)
    for next := range c {
        fmt.Printf("%v %s\n", next, statusUpdate())
    }
}

Вывод:

2020-07-23 19:54:46.764984441 +0500 +05 m=+5.000241495 
2020-07-23 19:54:51.764984609 +0500 +05 m=+10.000241638 
2020-07-23 19:54:56.76481557 +0500 +05 m=+15.000072594 
2020-07-23 19:55:01.765103332 +0500 +05 m=+20.000360383 
... // и так каждые 5 секунд


Читайте также:


Комментариев нет:

Отправить комментарий