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

优先选择带渠道的案例

优先选择带渠道的案例

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贡献1532条经验 获得超11个赞

如果我理解正确的话,你想要做的是用无限循环替换 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

添加回答

举报

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