如何打破时间。睡着了

时间:2013-08-19 05:37:11

标签: go

我刚刚开始在几天前收拾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")
}

提前致谢!

2 个答案:

答案 0 :(得分:6)

听起来你想向主要的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

的工作示例

当计时器大于自动收报机时,它会打勾。当它小于时,你看到的只是“完成”。

答案 1 :(得分:0)

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

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

尝试在你的睡眠周围放一个while循环,然后让它睡一秒

将条件设置为func上的bool

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

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

希望这有帮助:)