【问题标题】:Timer Channel - Issue stdout inside loop计时器通道 - 在循环内发出标准输出
【发布时间】:2016-10-28 16:19:51
【问题描述】:

我创建了一个无限循环来打印“诗人”,但没有在控制台中打印任何内容。

func main() {
    t := time.NewTimer(1 * time.Minute)
    for {
        k:=<-t.C
        fmt.Print("%T",k)
        fmt.Println("poet")
    }
}

不知何故,当我删除以下两行时,程序运行正常

k:=<-t.C
fmt.Print("%T",k)

我是Golang的新手,请帮助我了解导致此问题的原因。谢谢

【问题讨论】:

  • 您希望在每种情况下会发生什么?

标签: go timer


【解决方案1】:

Timer 类型代表一个单个事件, 所以当它发生在这里 k:=&lt;-t.C 你遇到了死锁——因为所有 go-routines 都处于休眠状态,并且你永远不会在循环中获得另一个时间值。

下面是使用 Timer 的例子,也许你想用 Ticker 代替?

func main() {
    timer := time.NewTimer(time.Second * 2)
    <- timer.C
    println("Timer expired")
}

【讨论】:

  • 嗨,我们不能在循环中使用
  • 不,不应该这样使用。它只会阻塞循环。
  • 请看这个例子,在循环中同时使用了ticker和timer mmcgrana.github.io/2012/09/…
  • 它在 switch 内部使用,并且 switch 在循环内部,这样你也可以在 goroutine 或许多其他方式中运行它,但这不是重点。就您的问题而言,这不是一种可以使用的方式,至少提供您想要实现的目标。
【解决方案2】:

这将打印 'poet' 直到时间到期。

package main
import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    timeElapsed := true
    for timeElapsed {
        fmt.Println("poet")
        timeElapsed = (time.Since(now) < (1 * time.Second))
    }
    fmt.Println("Times up!")
}

【讨论】:

  • @我没有收到任何警告,控制台输出是空白的。另外,我们如何用 goroutine 替换循环,两者都用于不同的目的,不是吗?
  • @JishnuPrathap 我已经更新了我的答案以正确匹配你所追求的(在阅读你的 cmets 之后)。 Timer 并不是您真正想要的,您不能在提供的示例中有效地将其用作哨兵。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多