Golang 中的股票行情通道行為
如果您迭代股票行情通道並調用Stop(),通道將暫停但不會關閉。這可能會導致 goroutine 無限期地保持活動狀態。
案例示例:
考慮以下代碼片段:
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) go func() { for _ = range ticker.C { fmt.Println("tick") } }() time.Sleep(3 * time.Second) fmt.Println("stopping ticker") ticker.Stop() time.Sleep(3 * time.Second) }
輸出:
2013/07/22 14:26:53 tick 2013/07/22 14:26:54 tick 2013/07/22 14:26:55 tick 2013/07/22 14:26:55 stopping ticker
正如你所看到的,儘管停止了Ticker,goroutine 仍然繼續無限期地迭代,因為通道沒有關閉。
解:
確保goroutine 終止的一種方法是使用第二個通道,如下所示:
package main import ( "fmt" "log" "time" ) // Run the function every tick // Return false from the func to stop the ticker func Every(duration time.Duration, work func(time.Time) bool) chan bool { ticker := time.NewTicker(duration) stop := make(chan bool, 1) go func() { defer log.Println("ticker stopped") for { select { case time := <-ticker.C: if !work(time) { stop <- true } case <-stop: return } } }() return stop } func main() { stop := Every(1*time.Second, func(time.Time) bool { fmt.Println("tick") return true }) time.Sleep(3 * time.Second) fmt.Println("stopping ticker") stop <- true time.Sleep(3 * time.Second) }
在此程式碼中:
以上是在 Golang 中使用 Ticker Channel 時如何正確終止 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!