首页 > 后端开发 > Golang > 如何优雅地终止 Golang Ticker Goroutine?

如何优雅地终止 Golang Ticker Goroutine?

Mary-Kate Olsen
发布: 2024-11-08 16:42:02
原创
735 人浏览过

How to Gracefully Terminate a Golang Ticker Goroutine?

Golang 中的 Ticker Stop 行为

使用 Golang 的 Ticker 包时,必须了解 Stop() 的行为及其影响在相关频道上。虽然调用 Stop() 有效地停止了股票发射,但它不会关闭通道。

考虑示例:

package main

import (
    "time"
    "log"
)

func main() {
    ticker := time.NewTicker(1 * time.Second)
    go func(){
        for _ = range ticker.C {
            log.Println("tick")
        }
        log.Println("stopped")
    }()
    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    ticker.Stop()
    time.Sleep(3 * time.Second)
}
登录后复制

此代码演示了意外行为。使用ticker.Stop() 停止股票通道,但相应的goroutine 保持活动状态。这引起了人们的担忧:goroutine 的继续存在是否是不可取的,以及处理这种情况的最佳方法。

使用第二个通道来停止

一个有效的解决方案是引入第二个通道,专门用于指示股票行情停止。

package main

import (
    "log"
    "time"
)

// Every runs the provided function periodically, allowing the function to control when to stop.
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
    ticker := time.NewTicker(duration)
    stop := make(chan bool, 1) // Channel for signaling stop

    go func() {
        defer log.Println("ticker stopped")
        for {
            select {
            case time := <-ticker.C:
                if !work(time) { // Function decides to stop
                    stop <- true
                }
            case <-stop: // Signal to stop has been received
                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 // Send the stop signal on the stop channel
    time.Sleep(3 * time.Second)
}
登录后复制

在此修改后的代码中,Every() 函数同时接受持续时间和返回指示是否继续的布尔值的函数。停止通道用于向ticker goroutine传达停止信号,确保其优雅终止。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板