2013-08-19 21 views
1

我剛開始拿起Golang的前幾天,我似乎無法找出突圍time.Sleep()的...如何突圍time.Sleep

我可以返回/跳出for循環,但該功能不會返回,因爲睡眠繼續進行。

我猜測解決方案很簡單,但我似乎無法找到答案。

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") 
} 

提前感謝!

回答

6

這聽起來像你想發送的主夠程的消息,告訴它你的其他的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

當計時器大於股票更大的工作實例,它蜱。當它不足時,你看到的只是「完成」。

+0

感謝您的迴應! – davissp14

+0

我最終通過添加一個渠道來解決它,就像你給的例子。然後我簡單地做了一個:如果! < - 完成;睡覺...;否則返回; – davissp14

+0

@ davissp14,循環是這樣做的一個相當古怪的方式。以我的例子來說,你會收到一個更改的通知,而不是經常檢查。 –

0

這可能不是一個非常具體的解決方案,但您可能可以應用它。

我的理解是,你需要在特定條件下突破計時器。

嘗試將while循環在你的睡眠,使睡覺第二

設置條件爲bool您FUNC

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

這樣你就可以打出來的計時器時你需要

希望這有助於:)

+1

這是處理任何語言的併發的錯誤方法。 Downvote –

+1

這不是C.你的代碼不會編譯,因爲(1)沒有這樣的事情,而(2)你的大括號不在同一行。 –