在需要时中断 anaconda 的推特流

Breaking anaconda's twitter stream when needed

我有一些代码可以收听包含特定单词的 Twitter 实时推文(此处为 "obama" 示例)并使用 anaconda 包打印它们 (https://github.com/ChimeraCoder/anaconda)。

我希望能够在我调用其他函数时在给定时刻关闭推文流。为了做到这一点,我尝试创建一个名为 "stop" 的通道,只要它收到一个值,程序就会停止监听流。

我尝试了以下代码在执行 10 秒后停止流:

    func main() {
            trackingArray := []string{ "obama"}

            anaconda.SetConsumerKey(consumerKey)
            anaconda.SetConsumerSecret(consumerSecret)

            api := anaconda.NewTwitterApi(accessToken, accessTokenSecret)

            stream := api.PublicStreamFilter(url.Values{
                        "track":    trackingArray,
            })

            stop := make(chan int)

            for {
                select {
                    case v := <- stream.C :
                        tweet, ok := v.(anaconda.Tweet)
                        if !ok {
                            /* handle incorrect type */
                            continue
                        }

                        fmt.Print(tweet)

                    case <- stop :
                        stream.Stop()
                        break

                    }
                }

           go After(&stop)
    }

    func After(stop *chan int){
        time.Sleep(time.Second * 10)
        *stop <- 1
    }

此代码根本不起作用,流永远不会停止...

我的停止频道应该是可重复使用的,因为这背后的目标是它作为 on/off 切换到 start/stop 收听 Twitter 的流。

这可能是一个新手问题,但我认为我已经了解频道的工作原理,但我有点迷路了... 提前感谢您的宝贵时间!

您正在 go After(&stop) for 循环之后启动 goroutine,goroutine 需要中断该循环。这导致循环永远不会中断并且 gouroutine 永远不会启动。

要修复它,只需将 go After(&stop) 放在 for 循环之前。