条件性超时

我有一些代码,有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)
    }
}

去游乐场

我想把WaitTimeout变成可选的,但不知道该如何处理。如果我把 waitTimer 附带 if 语句,那么它就不会工作,因为 waitTimer 没有定义为 select 语句… 如何让WaitTimeout成为有条件的?

我可以只 .Stop() 但这似乎有点脏……

解决方案:

你可以在外面声明等待计时器和它的通道。if 语句,并且只有在需要等待计时器时才初始化它们。如果不需要,通道可以保持它的零值,也就是 nil-因为从一个 nil 通道永远堵塞,所以这 case 将永远不会准备好(详见 一个非初始化的通道是如何表现的?).

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)

    // ...
    }
}

那么当然你只能重置等待计时器,如果它存在的话,这也必须被检查(如果它回来了,不要忘了把通道放掉 false):

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

试试吧 去游乐场.

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何使用扩展和硒打开一个新的标签页?

2022-9-9 3:51:21

未分类

分割前的一次出现一定格式的字符的出现时间

2022-9-9 3:51:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索