Использовать сон внутри бегущей строки

package main

import (
    "log"
    "time"
)

func main() {
    per := 10
    period := time.Duration(per) * time.Second
    log.Printf("period : %d sec\n\n", per)

    ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))
    for {
        curTime := <-ticker.C
        log.Printf("started %s", curTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("ended %s\n\n", curTime.Format("2 15:04:05"))
    }

}

Когда я использую time.Sleep внутри тикера, тикер перестает работать должным образом, я хочу, чтобы тикер запускался каждые 10 секунд, но я вижу результаты, как на скриншоте. Как я могу сделать это правильно? введите здесь описание изображения


person StrRoma    schedule 25.03.2021    source источник


Ответы (2)


Ваш код работает, но вы печатаете неправильное время.

    for {
        curTime := <-ticker.C
        log.Printf("started %s", curTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("ended %s\n\n", curTime.Format("2 15:04:05"))
    }

curTime — это время тика, поэтому одно и то же время печатается дважды. Вместо этого вы должны использовать time.Now() для получения текущего времени.

    for {
        tickTime := <-ticker.C
        log.Printf("tick %s", tickTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("after sleep %s\n\n", time.Now().Format("2 15:04:05"))
    }

И, поскольку NewTicker принимает Duration, его можно упростить.

    per := 10
    period := time.Duration(per) * time.Second

    // Rather than printing the number in `per` and assuming it's
    // seconds, print the duration which can format itself.
    log.Printf("period : %s\n\n", period)

    // NewTicker takes a Duration which we already have.
    ticker := time.NewTicker(period)

Затем вы получаете правильный 5-секундный сон за 10-секундные тики.

2021/03/25 16:02:49 period : 10 sec

2021/03/25 16:02:59 tick 25 16:02:59
2021/03/25 16:03:04 after sleep 25 16:03:04

2021/03/25 16:03:09 tick 25 16:03:09
2021/03/25 16:03:14 after sleep 25 16:03:14
person Schwern    schedule 25.03.2021

Заменять

ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))

с

ticker := time.NewTicker(period)

Посмотрите, работает ли это.

person maxm    schedule 25.03.2021