我正在构建一个我想要持续运行的机器人(总是在/正在聆听)并且在一段时间后,Tweepy twitter API StreamListener出现问题并且变得没有响应。
当我启动它时,它运行良好并且响应它应该 - 但是如果我离开它而没有从流中获得任何输入它就会僵尸化。不退出/死亡,但也没有获得任何新数据。
我认为我有逻辑来解释超时,但显然要么我做得不对,要么就是问题。我应该补充一点,我正在使用supervisord将其作为Ubuntu中的守护进程运行。
我已经确定了两种可能的解决方案,但想知道是否有“正确”的方法。这是我当前的设置(不包括on_data,效果很好):
from tweepy import StreamListener
from tweepy import Stream
class StreamListener(tweepy.StreamListener):
def on_data(self, tweet_payload):
# do some stuff
def on_error(self, status_code):
print >> stderr, "Encountered an error with status code:"
sys.stderr.flush()
# if the error for bad credentials, end stream
if status_code == 401:
return False
# rate limit, close
if status_code == 420:
return False
# When timed out
def on_timeout(self):
# Print timeout message
print >> stderr, "Timeout..."
# Wait 10 seconds
time.sleep(60)
# Return nothing
return
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
logging.debug("Starting request stream with %s at %s" % (api.me().name, str(datetime.datetime.now())))
stream_listener = StreamListener()
stream = Stream(auth=api.auth, listener=stream_listener)
stream.filter(track=["#hashtagtotrackone", "#hashtagtotracktwo"])
我发现的一个解决方案是在最后循环监听器块并检查stream.running,如果不是,则删除流并启动新流。我相信使用stream.running
然后使用stream.disconnect()
此变体就是每隔几分钟/小时循环一次Feed并重新连接以保持在陈旧连接之上。
但是另一个stackoverflow帖子建议做一下try / except,from: Tweepy. Make stream run forever
while True:
listener = TweetStreamListener()
stream = Stream(auth, listener, timeout=60)
try:
stream.filter(track=["#hashtagtotrackone", "#hashtagtotracktwo"])
except Exception, e:
print "Error. Restarting Stream.... Error: "
print e.__doc__
print e.message
是否有流媒体维护的最佳实践,即:让它优雅地处理自己,或者每隔24小时关闭一次流并将其打开以保持最佳状态?
tweepy的流API有一些很好的文档,但没有任何真正好的例子。我也在想我应该使用异步,因为这个机器人会响应带有指定主题标签的推文,我可能想要它自己的线程中的监听器。
提前致谢。