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

有条件的 Go 例程/通道

有条件的 Go 例程/通道

Go
犯罪嫌疑人X 2021-10-18 17:14:38
我想让统计例程有条件,以便它只在某些情况下运行,否则会浪费一半的时间。现在我有一个 go 例程充当生产者,通过缓冲通道为两个消费者例程提供数据。有没有办法让统计例程是有条件的,或者我应该遵循更好的模式?在此先感谢您的任何帮助!func main() {    options()    go produce(readCSV(loc))    go process()    go statistics() // only on flag    <-done}func produce(entries [][]string) {    regex, err := regexp.Compile(reg)    if err != nil {        log.Error(reg + ", is not a valid regular expression")    } else {        for _, each := range entries {            if regex.MatchString(each[col]) {                matches <- each                stats <- each // only on flag            }        }    }    done <- true}func process() {    for {        match := <-matches        if len(match) != 0 {            // PROCESS        }    }}func statistics() {    for {        stat := <-stats        if len(stat) != 0 {            // STATISTICS        }    }}
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

将此作为条件并没有错:


var stats chan []string  // Don't initialize stats.


func main() {

    options()

    go produce(readCSV(loc))

    go process()

    if flag {

        stats = make(chan []string, 1024)

        go statistics() // only on flag

    }

    <-done

}


func produce(entries [][]string) {

    regex, err := regexp.Compile(reg)

    if err != nil {

        log.Error(reg + ", is not a valid regular expression")

    } else {

        for _, each := range entries {

            if regex.MatchString(each[col]) {

                matches <- each

                if stats != nil {

                    stats <- each // only on flag

                }

            }

        }

    }

    close(done)

}


func process() {

    for {

        select {

        case match := <-matches:

            if len(match) != 0 {

              // PROCESS

            }

        case <-done:

            return

        }

    }

}


func statistics() {

    for {

        select {

        case stat := <-stats:

            if len(stat) != 0 {

                // STATISTICS

            }

        case <-done:

            return

        }

    }

}


查看完整回答
反对 回复 2021-10-18
?
富国沪深

TA贡献1790条经验 获得超9个赞

如果您从代码中的许多地方更新统计信息,您可能需要添加一些辅助方法。就像是:


type stats struct {

    ch chan []string

}


func (s *stats) update(a []string) {

    if s != nil {

        s.ch <- a

    }

}


func (s *stats) start() {

    if s != nil {

        s.ch = make(chan []string)

        go statistics()

    }

}


var s *stats

if enabled {

    s = new(stats)

}

s.start()


// later in the code

s.update(each)


查看完整回答
反对 回复 2021-10-18
?
暮色呼如

TA贡献1853条经验 获得超9个赞

也许您正在寻找 flag 包。


import "flag"


var withStats = flag.Boolean("s", false, "Do statistics")


func main() {

    flag.Parse()

    ...

    if *withStats == true {

        t := statType

        size := 100

        stats := make(chan, t, size)

        go statistics() // only on flag

    }

    ...

}


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

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