为了账号安全,请及时绑定邮箱和手机立即绑定

优先选择带渠道的案例

优先选择带渠道的案例

Go
Smart猫小萌 2022-11-23 15:48:05
我有这个功能,这样里面的方法就可以自动运行了。我的问题是第二种情况sigC仅在 case ticker.C 完成后才有效,这并不理想,因为程序运行时带有标志,因此如果我想更改标志并改变程序的行为,我必须等待代码方法完成运行,这可能需要一些时间。我的目标是当我按下 Ctrl+C 时,程序会立即完成运行。func report() error {    ticker := time.NewTicker(timeConfig)    sigC := make(chan os.Signal, 1)    signal.Notify(sigC, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt)    for range ticker.C {        select {        case <-ticker.C:            connection = connectionInit()            tagValues, err := fetchLatestTags()            if err != nil {                return err            }            if len(tagValues) >= threshold {                metrics, err := fetchMetrics(tagValues)                if err != nil {                    return err                }                if stdout {                    err = locally(metrics)                    if err != nil {                        return err                    }                } else {                    err = sendMail(metrics)                    if err != nil {                        return err                    }                }            }            connection.Close()        case <-sigC:            return nil        }    }    return nil}
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

如果我理解正确的话,你想要做的是用无限循环替换 range-over-channel 循环。即for range ticker.C { ... }-> for { ... }。


如果您希望程序而不是report函数立即完成而不等待case <-ticker.C:块中的代码完成,您应该在单独的 goroutine 中执行该代码块并将case <-sigC:块从更新return nil为os.Exit(1).


func report() {

    ticker := time.NewTicker(timeConfig)

    defer ticker.Stop()


    sigC := make(chan os.Signal, 1)

    signal.Notify(sigC, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt)


    for {

        select {

        case <-ticker.C:

            go func() {

                connection = connectionInit()


                tagValues, err := fetchLatestTags()

                if err != nil {

                    return

                }

                if len(tagValues) >= threshold {

                    metrics, err := fetchMetrics(tagValues)

                    if err != nil {

                        return

                    }

                    if stdout {

                        err = locally(metrics)

                        if err != nil {

                            return

                        }

                    } else {

                        err = sendMail(metrics)

                        if err != nil {

                            return

                        }

                    }

                }

                connection.Close()

            }()

        case <-sigC:

            os.Exit(1)

        }

    }

}


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信