dongshi3361 2015-07-08 03:03
浏览 2
已采纳

有条件的例程/通道

I would like to make the statistics routine conditional so that it only runs on certain cases otherwise it will waste cycles half the time. Right now I have one go routine act as a producer to feed the two consumer routines via buffered channels. Is there a way I can make it so the statistics routine is conditional or is there a better pattern I should follow? Thanks in advance for any and all help!

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条回答 默认 最新

  • dongposhi8677 2015-07-08 03:13
    关注

    There is nothing wrong with making this conditional:

    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
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算