Go Timer тупик при остановке - PullRequest
2 голосов
/ 28 марта 2019

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

Существует ли правильный способ остановки и сброса таймера, который не связан с тупиками или условиями гонки?Мне известно, что использование выбора по умолчанию включает условие гонки по времени доставки сообщений в канале и не может зависеть от.

package main

import (
    "fmt"
    "time"
    "sync"
)

func main() {
    fmt.Println("Hello, playground")

    timer := time.NewTimer(1 * time.Second)
    wg := &sync.WaitGroup{}
    wg.Add(1)

    go func(_wg *sync.WaitGroup) {
        <- timer.C
        fmt.Println("Timer done")
        _wg.Done()
    }(wg)

    wg.Wait()
    fmt.Println("Checking timer")
    if !timer.Stop() {
        <- timer.C
    }

    fmt.Println("Done")
}

1 Ответ

2 голосов
/ 28 марта 2019

В соответствии с документами timer.Stop , есть предостережение относительно опустошения канала:

при условии, что программа не получена от t.C уже ...

Это нельзя сделать одновременно с другими получениями от Таймера. канал.

Поскольку канал уже опустошен и больше не будет запускаться, второй <-timer.C будет блокироваться навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...