dsjbest2014 2015-02-15 14:23
浏览 55
已采纳

转到:一个具有多个收听者的频道

I'm pretty new to Go so sorry if the topic is wrong but I hope you understand my question. I want to process events to different go routines via a channel. Here is some sample code

type Event struct {
    Host string
    Command string
    Output string
}


var (
    incoming        = make(chan Event)
)

func processEmail(ticker* time.Ticker) {
    for {
        select {
        case t := <-ticker.C:
            fmt.Println("Email Tick at", t)
        case e := <-incoming:
            fmt.Println("EMAIL GOT AN EVENT!")
            fmt.Println(e)
        }
    }
}

func processPagerDuty(ticker* time.Ticker) {
    for {
        select {
        case t := <-ticker.C:
            fmt.Println("Pagerduty Tick at", t)
        case e := <-incoming:
            fmt.Println("PAGERDUTY GOT AN EVENT!")
            fmt.Println(e)
        }
    }
}

func main() {

    err := gcfg.ReadFileInto(&cfg, "dispatch-api.cfg")
    if err != nil {
        fmt.Printf("Error loading the config")
    }

    ticker := time.NewTicker(time.Second * 10)
    go processEmail(ticker)

    ticker := time.NewTicker(time.Second * 1)
    go processPagerDuty(ticker)
}


func eventAdd(r render.Render, params martini.Params, req *http.Request) {

    // create an event now
    e := Event{Host: "web01-east.domain.com", Command: "foo", Output: "bar"}
    incoming <- e
}

So the ticker events work just create. When I issue an API call to create an event I just get output from the processEmail function. Its whatever go routine is called first will get the event over the channel.

Is there a way for both functions to get that event?

  • 写回答

2条回答 默认 最新

  • dqyitt2954 2015-02-15 18:57
    关注

    You can use fan in and fan out (from Rob Pike's speech):

    package main
    
    func main() {
        // feeders - feeder1, feeder2 and feeder3 are used to fan in
        // data into one channel
        go func() {
            for {
                select {
                case v1 := <-feeder1:
                    mainChannel <- v1
                case v2 := <-feeder2:
                    mainChannel <- v2
                case v3 := <-feeder3:
                    mainChannel <- v3
                }
            }
        }()
    
        // dispatchers - not actually fan out rather dispatching data
        go func() {
            for {
                v := <-mainChannel
    
                // use this to prevent leaking goroutines
                // (i.e. when one consumer got stuck)
                done := make(chan bool)
    
                go func() {
                    consumer1 <- v
                    done <- true
                }()
                go func() {
                    consumer2 <- v
                    done <- true
                }()
                go func() {
                    consumer3 <- v
                    done <- true
                }()
    
                <-done
                <-done
                <-done
            }
        }()
    
        // or fan out (when processing the data by just one consumer is enough)
        go func() {
            for {
                v := <-mainChannel
                select {
                case consumer1 <- v:
                case consumer2 <- v:
                case consumer3 <- v:
                }
            }
        }()
    
        // consumers(your logic)
        go func() { <-consumer1 /* using the value */ }()
        go func() { <-consumer2 /* using the value */ }()
        go func() { <-consumer3 /* using the value */ }()
    }
    
    type payload int
    
    var (
        feeder1 = make(chan payload)
        feeder2 = make(chan payload)
        feeder3 = make(chan payload)
    
        mainChannel = make(chan payload)
    
        consumer1 = make(chan payload)
        consumer2 = make(chan payload)
        consumer3 = make(chan payload)
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路