gpt4 book ai didi

go - 如何同时收听两个 Golang channel ?

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:50 26 4
gpt4 key购买 nike

我基本上是通过爬虫收集数据,然后想以两种方式处理这些数据:拒绝或接受。为了不减慢抓取速度,我将数据传递到拒绝 channel 或接受 channel 。我需要这些 channel 同时收听各自 channel 中的数据。到目前为止,这是我的尝试:

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)

请帮忙

最佳答案

我不是很清楚你的意思。您可能想要做的是拥有一个 channel ,根据包含信息的数据类型为您提供所需的所有信息。这是我的意思的一个例子。

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")
}
}

关于go - 如何同时收听两个 Golang channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com