- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如果主题错误,我很抱歉,但我希望你理解我的问题。我想通过 channel 将事件处理到不同的 goroutine。这是一些示例代码
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
}
因此,股票代码事件只是创建而已。当我发出 API 调用来创建事件时,我只是从 processEmail 函数获得输出。它首先调用的任何 goroutine 都会通过 channel 获取事件。
有没有办法让这两个函数都获得该事件?
最佳答案
您可以使用 fan in 和 fan out(来自 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)
)
关于Go:一个 channel 有多个听众,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527038/
这个问题在这里已经有了答案: Callback or Promise? [duplicate] (2 个答案) 关闭 7 年前。 我是一个巨大的 promise 链,但是我意识到其中一个函数返回一个
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: “On file dialog cancel” event in JavaScript 当用户点击文件上传对
我还在学习 flutter 。以下是本教程中的代码。当我调用Authservice配置文件时,它返回Observable>。如何获取其中的数据以进行显示。 这是我到目前为止所做的事情,但是它返回了整个
$(".cblClaimSources").on('click', ':checkbox', function (){ alert('im : '+ $(this).attr('id') +
首先,我知道这个问题已经被问过多次,但我的应用程序最近出现的问题激起了我对这个问题的兴趣。我也阅读了 Firebase 文档。 What is the difference between Child
由于 Tomcat 8.0 已停产,我想将我的应用程序直接升级到 Tomcat 9。 当我将基于 Java 的应用程序从本地部署到我的服务器时,我有一个脚本覆盖了 server.xml。我将服务器升级
我是一名优秀的程序员,十分优秀!