【问题标题】:How to break out of time.Sleep如何打发时间。睡觉
【发布时间】:2013-08-19 05:37:10
【问题描述】:

我前几天刚开始学Golang,似乎想不通。Sleep()...

我可以返回/跳出 for 循环,但函数不会返回,因为 Sleep 继续做它的事情。

我猜解决方案很简单,但我似乎找不到答案。

func main() {
  ticker := time.NewTicker(time.Second * 1)

  go func() {
    for i := range ticker.C {
      fmt.Println("tick", i)
      ticker.Stop()
      break
    }
  }()
  time.Sleep(time.Second * 10)
      ticker.Stop()

  fmt.Println("Hello, playground")
}

提前致谢!

【问题讨论】:

    标签: go


    【解决方案1】:

    听起来你想向主 goroutine 发送一条消息,告诉它你的另一个 goroutine 已经完成。为此,渠道是最好的选择。

    func main() {
        ticker := time.NewTicker(time.Second)
        done := make(chan bool, 1)
    
        go func() {
            for i := range ticker.C {
                fmt.Println("tick", i)
                ticker.Stop()
                break
            }
    
            done <- true
        }()
    
        timer := time.NewTimer(time.Second/2)
        select {
        case <-done:
            timer.Stop()
        case <-timer.C:
            ticker.Stop()
        }
    
        fmt.Println("Done")
    }
    

    http://play.golang.org/p/5NFsvC5f7P 的工作示例

    当计时器大于ticker时,它会滴答作响。当它小于时,你看到的都是“完成”。

    【讨论】:

    • 感谢您的回复!
    • 我最终通过添加一个频道来解决它,就像你给出的例子一样。然后我简单地做了一个:如果!
    • @davissp14,循环是一种相当老套的方法。在我的示例中,您会收到更改通知,而不是每隔一段时间检查一次。
    【解决方案2】:

    这可能不是一个非常具体的解决方案,但您也许可以应用它。

    我的理解是,你需要在特定条件下打破计时器。

    尝试在你的睡眠周围放置一个while循环并让它睡眠一秒钟

    在你的函数上将条件设置为布尔值

    while (condition_to_sleep)
    {
        time.Sleep(1000);
    }
    

    这样你可以在需要时打破计时器

    希望有帮助:)

    【讨论】:

    • 这是在任何语言中处理并发的错误方法。投反对票
    • 这不是 C。您的代码无法编译,因为 (1) 没有 while 之类的东西,并且 (2) 您的大括号不在同一行。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多