如果话题有问题,我很抱歉去,所以我很抱歉,但我希望你理解我的问题.我想通过频道将事件处理到不同的例行程序.这是一些示例代码
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
}
Run Code Online (Sandbox Code Playgroud)
因此,自动收报机事件只是创建.当我发出API调用来创建事件时,我只是从processEmail函数获得输出.无论什么样的例程被称为第一个将通过频道获得事件.
有两种功能可以获得该事件吗?
Kav*_*ian 13
你可以使用粉丝和扇出(来自Rob Pike的演讲):
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)
)
Run Code Online (Sandbox Code Playgroud)
通道是一种点对点通信方法,而不是广播通信方法,所以不,如果不做一些特殊的事情,你就无法同时获得这两个函数来获取事件。
您可以为两个 goroutine 建立单独的通道,并将消息发送到每个通道中。这可能是最简单的解决方案。
或者,您也可以让一个 goroutine 向下一个 goroutine 发出信号。
据我所知,Go 有两种执行广播信号的机制。一是关闭通道。但这只能工作一次。
另一种是使用sync.Cond锁。这些使用起来比较棘手,但允许您通过单个事件唤醒多个 goroutine。
如果我是你,我会选择第一个选项,将事件发送到两个不同的渠道。这似乎很好地描述了问题。
| 归档时间: |
|
| 查看次数: |
4936 次 |
| 最近记录: |