在需要时打破anaconda的twitter流

时间:2018-02-09 13:07:50

标签: go twitter anaconda channel goroutine

我有一些代码可以收听包含特定单词的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
    }

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

我的停止频道应该是可重复使用的,因为这背后的目标是它可以作为开/关切换来开始/停止收听Twitter的流。

这可能是一个新手问题,但我想我已经理解了渠道是如何工作的,我在这里迷失了...... 提前感谢您的时间!

1 个答案:

答案 0 :(得分:1)

你正在 go After(&stop)循环之后启动gouroutine for ,goroutine需要打破这个循环。这导致循环永远不会被打破,并且gouroutine永远不会开始。

要解决此问题,只需将go After(&stop)放在for循环之前。