如何同时收听两个 Golang 频道?



我基本上通过抓取器收集数据,然后希望以两种方式处理这些数据:拒绝或接受。为了不减慢刮板的速度,我将数据传递到拒绝通道或接受通道。我需要这些通道同时侦听相应通道中的数据。这是我到目前为止的尝试:

func main() {
okChannel := make(chan Article)
rejectChannel := make(chan Article)
scrape := new(scrapers)
go Init(okChannel, rejectChannel)
go func(okChannel chan Article) {
for article := range okChannel {
SaveArticle(article)
fmt.Printf("SAVED")
}
}(okChannel)
go func(rejectChannel chan Article) {
for article := range rejectChannel {
RejectArticle(article)
fmt.Printf("REJECTED")
}
}(rejectChannel)

请帮忙

我不太确定你的意思。您可能想要做的是拥有一个通道,该通道根据包含信息的数据类型为您提供所需的所有信息。这是一个例子来说明我的意思。

type ArticleClassifier struct {
Rejected bool
Article  Article
}
func main() {
classifierChannel := make(chan ArticleClassifier)
go Init(classifierChannel)
go func(ch chan ArticleClassifier) {
for ac := range classifierChannel {
if ac.Rejected {
// Reject article
} else {
// Save article
}
}
}
}

但是似乎没有必要使用上面的解决方案来执行此操作。也许您的问题是该计划会提前结束?如果这是问题所在,那就不要让第二个侦听器成为goroutine。下面是示例中的一些重构代码:

func main() {
okChannel := make(chan Article)
rejectChannel := make(chan Article)
scrape := new(scrapers)
go Init(okChannel, rejectChannel)
go func(okChannel chan Article) {
for article := range okChannel {
SaveArticle(article)
fmt.Printf("SAVED")
}
}(okChannel)
for article := range rejectChannel {
RejectArticle(article)
fmt.Printf("REJECTED")
}
}

最新更新