我有一些代码可以收听包含特定单词的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的流。
这可能是一个新手问题,但我想我已经理解了渠道是如何工作的,我在这里迷失了...... 提前感谢您的时间!
答案 0 :(得分:1)
你正在 go After(&stop)
循环之后启动gouroutine for
,goroutine需要打破这个循环。这导致循环永远不会被打破,并且gouroutine永远不会开始。
要解决此问题,只需将go After(&stop)
放在for
循环之前。