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条)

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路