使用 Go 例程時,了解如何有效終止它們變得至關重要。考慮以下設定:
<code class="go">func startsMain() { go main() } func stopMain() { // TODO: Kill main } func main() { // Infinite loop }</code>
此設定在名為 main 的 goroutine 中建立一個無限循環。要終止循環,我們需要一種方法來從 stopMain 控制 Goroutine。
殺死 Goroutine 的有效方法是透過 Channel 和 select 語句。
<code class="go">var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop(quit) } func stopLoop() { close(quit) } func loop(quit chan struct{}) { for { select { case <-quit: return default: // Do stuff } } }</code>
在此範例中,我們使用名為 quit 的零大小通道(chan struct{})來指示 goroutine 停止。 Loop 函數使用 select 語句重複檢查退出通道。當 quit 收到一個值(表示停止請求)時,循環退出。
Go 提供了額外的並發模式來處理 goroutine。請訪問 Go 博客,以了解有關這些模式的更多見解。
要定期執行函數,同時避免 CPU 耗盡,您可以使用程式碼。
<code class="go">import "time" // [...] func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Do stuff } } }</code>
在這種情況下,選擇區塊,直到 quit 接收到值或股票觸發,從而允許該函數以指定的時間間隔執行。
以上是如何有效終止 Go 中的 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!