首頁 > 後端開發 > Golang > 在 Golang 中使用 Ticker Channel 時如何正確終止 Goroutine?

在 Golang 中使用 Ticker Channel 時如何正確終止 Goroutine?

Patricia Arquette
發布: 2024-11-07 19:16:02
原創
508 人瀏覽過

How to Properly Terminate a Goroutine When Using a Ticker Channel in Golang?

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)
}
登入後複製

在此程式碼中:

  • Every 函數建立兩個通道:一個股票行情通道和一個停止通道。
  • goroutine 迭代兩個通道。
  • 如果工作函數回傳 false,則通知停止通道,導致 goroutine 退出。
  • 當呼叫 Stop() 時,它會向 stop 通道發送一條訊息,從而終止 goroutine。

以上是在 Golang 中使用 Ticker Channel 時如何正確終止 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板