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

时间:2018-08-17 20:58:35

标签: go 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)

请帮助

1 个答案:

答案 0 :(得分:1)

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

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