У меня есть какой-то код, есть 3 таймера,
- GracefulExecutionTimeout - общее время выполнения
- WaitTimeout - время начального ожидания первого сообщения
- IdleTimeout - время ожидания последующих сообщений
Если достигнут какой-либо из таймеров, приложение должно полностью завершиться. У меня это работает ниже
msgs := make(chan string)
go func() {
time.Sleep(time.Second)
msgs <- "test"
}()
// graceful max execution time
gracefulMaxTimeout := time.Second * time.Duration(10)
gracefulMaxTimer := time.NewTimer(gracefulMaxTimeout)
// idleTimeout
idleTimeout := time.Second * time.Duration(5)
idleTimer := time.NewTimer(idleTimeout)
// waitTimeout
waitTimeout := time.Second * time.Duration(2)
waitTimer := time.NewTimer(waitTimeout)
for {
select {
case <-gracefulMaxTimer.C:
fmt.Println("GracefulMaxExecutionTimeout Reached")
// graceful exit
os.Exit(0)
case <-idleTimer.C:
fmt.Println("IdleTimeout Reached")
// graceful exit
os.Exit(0)
case <-waitTimer.C:
fmt.Println("WaitTimeout Reached")
// graceful exit
os.Exit(0)
case msg := <-msgs:
// stop wait timer
waitTimer.Stop()
fmt.Println(msg)
// Reset idle timer
if !idleTimer.Stop() {
<-idleTimer.C
}
fmt.Println("IdleIimeout Reset")
idleTimer.Reset(idleTimeout)
}
}
Go Детская площадка
Я хочу сделать WaitTimeout необязательным, но не знаю, как к нему подойти. Если я окружу конструкцию waitTimer
оператором if
, он не будет работать, поскольку waitTimer
не определен для оператора select
... Как я могу сделать условное ожидание WaitTimeout?
Я могу просто .Stop()
таймер после его создания, но это кажется немного грязным ...