2012-06-20 51 views
3

我做的goroutine使用一個簡單的時鐘信號:有沒有更好的方法來阻止Go中的無限goroutine?

func clockloop(ch chan byte) { 
    count := 0 
    for { 
     time.Sleep(FRAMELEN) 
     count++ 
    innerfor: 
     for count { 
      select { 
       case ch <- 1: 
        count-- 
       default: 
        break innerfor 
      } 
     } 
    } 
} 

func MakeClock() chan byte { 
    clock := make(chan byte) 
    go clockloop(clock) 
    return clock 
} 

我知道這個時鐘是不精確但這是無關緊要的。我想知道什麼是停止這個goroutine的最好方法?

理想情況下,只要任何聽衆通道超出範圍,我就會喜歡它,但我確實知道如何做到這一點(非常像垃圾收集器,但適用於goroutines)。我已經想出了兩種方法來手動停止它:(1)使用全局停止變量,所有這些goroutine將檢查每個循環,(2)使用停止通道。每個這些的缺點是我必須手動停止goroutines。

+1

參見http://stackoverflow.com/questions/6807590/how-to-stop-a-goroutine – Sonia

回答

9

停止通道是一個很好的方法。門廳必須自行停止。沒有辦法從外部殺死一個人。

僅供參考有this thread上的Go-堅果其中伊恩本質上講,這說和羅斯補充道,「殺個人夠程是一個非常不穩定的事情: 這是不可能知道這些 夠程有什麼鎖或其他資源仍然需要清理 程序才能繼續順利運行。「

相關問題