登录
首页 >  Golang >  Go问答

案例中的优先选择渠道

来源:stackoverflow

时间:2024-02-15 17:51:24 258浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《案例中的优先选择渠道》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我有这个函数,以便内部的方法在股票代码上运行。我的问题是,第二种情况,sigc,仅在caseticker.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]强制 go select 语句优先级

[2]go select 语句中的优先级解决方法


正确答案


如果我理解正确的话,您想要做的是将通道范围循环替换为无限循环。即 for 范围标记。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)
        }
    }
}

理论要掌握,实操不能落!以上关于《案例中的优先选择渠道》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>