Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 条件超时_Go_Timer_Channel - Fatal编程技术网

Go 条件超时

Go 条件超时,go,timer,channel,Go,Timer,Channel,我有一些代码,有3个计时器 GracefulExecutionTimeout-总运行时间 WaitTimeout—初始等待第一条消息的时间 IdleTimeout—等待后续消息的时间 如果达到任何计时器,应用程序应完全退出。我让它在下面工作 msgs := make(chan string) go func() { time.Sleep(time.Second) msgs <- "test" }() // graceful max execution time gra

我有一些代码,有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)
    }
}
msgs:=make(chan字符串)
go func(){
时间。睡眠(时间。秒)

msgs您可以在
if
语句之外声明等待计时器及其通道,并且仅在需要等待计时器时对其进行初始化。否则,通道可能会保持其零值,即
nil
,因为从
nil
通道接收将永远阻塞,因此此
情况将永远不会就绪(有关详细信息,请参阅)


请在上试用。

可以解释为什么使用
waitTimer*time.Timer
而不是
waitTimer.Timer
?新到GoBecause
time.NewTimer()
返回类型为
*time.Timer>的值,一个指针,而不是
time.Timer
。确定-因此类型匹配。谢谢
useWaitTimer := true

var (
    waitTimer  *time.Timer
    waitTimerC <-chan time.Time
)
if useWaitTimer {
    waitTimeout := time.Millisecond * time.Duration(500)
    waitTimer = time.NewTimer(waitTimeout)
    waitTimerC = waitTimer.C
}

// ...

for {
    select {
    // ...

    case <-waitTimerC:
        fmt.Println("WaitTimeout Reached")
        // graceful exit
        os.Exit(0)

    // ...
    }
}
// stop wait timer if exists
if waitTimer != nil && !waitTimer.Stop() {
    <-waitTimerC
}