首頁 >後端開發 >Golang >如何有效終止 Go 中的 Goroutine?

如何有效終止 Go 中的 Goroutine?

DDD
DDD原創
2024-10-30 13:15:03814瀏覽

How do you effectively terminate a Goroutine in Go?

在 Go 中終止 Goroutine

使用 Go 例程時,了解如何有效終止它們變得至關重要。考慮以下設定:

<code class="go">func startsMain() {
    go main()
}

func stopMain() {
    // TODO: Kill main
}

func main() {
    // Infinite loop
}</code>

此設定在名為 main 的 goroutine 中建立一個無限循環。要終止循環,我們需要一種方法來從 stopMain 控制 Goroutine。

解:使用 Channel 和 select

殺死 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn