воскресенье, 2 августа 2020 г.

Пакет time в Golang, тип Timer

type Timer struct {
    C <-chan Time
    // содержит отфильтрованные или неэкспортированные поля
}

Тип Timer представляет одно событие. Когда истекает Timer, текущее время будет отправлено на C, если Timer не был создан AfterFunc. Timer должен быть создан с NewTimer или AfterFunc.

Функция AfterFunc

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

AfterFunc ожидает истечения продолжительности d и затем вызывает f в своей собственной goroutine. Он возвращает Timer, который можно использовать для отмены вызова, используя метод Stop.

Функция NewTimer

func NewTimer(d Duration) *Timer

NewTimer создает новый Timer, который будет отправлять текущее время на своем канале, по крайней мере, после продолжительности d.

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

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Создаем таймер")
    timer := time.NewTimer(1 * time.Second)
    
    fmt.Println("Ждем таймер")
    <-timer.C

    fmt.Println("Таймер истек")
}

Метод Reset

func (t *Timer) Reset(d Duration) bool

Reset изменяет таймер на истечение после срока действия d. Он возвращает true, если таймер был активен, false, если таймер истек или был остановлен.

Reset должен вызываться только на остановленных или истекших таймерах с опустошенными каналами. Если программа уже получила значение от t.C, таймер, как известно, истек, и канал опустошен, поэтому t.Reset можно использовать напрямую. Однако, если программа еще не получила значение от t.C, таймер должен быть остановлен и - если Stop сообщает, что истек таймер до его остановки - канал явно опустошен:

if !t.Stop() {
    <-t.C
}
t.Reset(d)

Это не должно быть сделано конкурентно с другими приемами от канала Timer.

Обратите внимание, что невозможно правильно использовать возвращаемое значение Reset, так как существует состояние гонки между опустошением канала и истечением нового таймера. Reset всегда должен вызываться на остановленных или просроченных каналах, как описано выше. Возвращаемое значение существует для сохранения совместимости с существующими программами.

Метод Stop

func (t *Timer) Stop() bool

Stop предотвращает срабатывание Timer. Он возвращает true, если вызов останавливает таймер, false, если таймер уже истек или был остановлен. Stop не закрывает канал, чтобы предотвратить неправильное чтение с канала.

Чтобы убедиться, что канал пуст после вызова Stop, проверьте возвращаемое значение и опустошите канал. Например, если программа еще не получила от t.C:

if !t.Stop() {
    <-t.C
}

Это не может быть сделано одновременно с другими приемами из канала Timer или другими вызовами метода Stop таймера.

Для таймера, созданного с помощью AfterFunc(d, f), если t.Stop возвращает false, то время таймера уже истекло, и функция f была запущена в своей собственной goroutine; Stop не ждет завершения f перед возвратом. Если вызывающий должен знать, завершено ли f, он должен явно координировать с f.


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


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

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