首页 >后端开发 >Golang >如何优雅地停止 Go 中在 Ticker Channel 上运行的 Goroutine?

如何优雅地停止 Go 中在 Ticker Channel 上运行的 Goroutine?

Patricia Arquette
Patricia Arquette原创
2024-11-09 01:40:02465浏览

How to Gracefully Stop a Goroutine Running on a Ticker Channel in Go?

管理 Go 中的 Ticker Stop 行为

处理通道时,考虑发送和接收操作的行为非常重要。对于股票通道,调用ticker.Stop()将停止股票生成新值,但通道本身保持打开状态。

挑战:悬挂 Goroutine

提供的代码片段演示了一个在股票通道上运行的 goroutine。然而,当调用ticker.Stop()时,goroutine会无限期地保持活动状态,因为通道没有关闭。

解决方案:使用第二个通道

来优雅地处理这种情况,可以引入辅助通道(止损)。 Goroutine 可以监听 select 语句中的 Ticker 通道和 Stop 通道。当停止通道上收到停止信号时,goroutine 可以自行关闭并退出。

下面修改后的代码采用了此解决方案:

package main

import (
    "log"
    "time"
)

// Every runs the provided function every tick.
// Return false from the function 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 {
        log.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}

当ticker.Stop() 为现在调用,在停止通道上发送信号,导致 goroutine 优雅退出,即使在股票代码已停止生成值之后也是如此。

以上是如何优雅地停止 Go 中在 Ticker Channel 上运行的 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn