go - 如何同时收听两个 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")
}
}
推荐阅读
- python - 打开 binance websocket 并显示不使用特定库的价格变化
- javascript - 有没有办法在地形图上完美对齐geo json文件?React、D3 和三个 js
- ruby-on-rails - 如何在 ruby on rails 的不同位置显示上传的图像?
- java - 应用程序因 'jvm 终止而崩溃。退出代码=1'
- c# - 肥皂服务抛出“响应提前结束,至少
需要额外的字节。”(IOException) - xamarin - 如何在 Xamarin 中创建无限 ListView?
- python - 使用多个字符串动态填充字典
- javascript - React - 从 json 动态渲染组件
- python - Python代码为跨账户的变量创建潜在客户值,账户的最后一个值为空
- javascript - 我的 chrome 扩展内容脚本与从 popup.js 发送的相同函数相乘