Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tweepy StreamListener过了一段时间就过时了--如何正确维护流连接?_Python_Twitter_Tweepy_Supervisord - Fatal编程技术网

Python Tweepy StreamListener过了一段时间就过时了--如何正确维护流连接?

Python Tweepy StreamListener过了一段时间就过时了--如何正确维护流连接?,python,twitter,tweepy,supervisord,Python,Twitter,Tweepy,Supervisord,我正在构建一个我希望持续运行(始终打开/侦听)的bot,Tweepy twitter API StreamListener在一段时间后变得过时,并且变得没有响应 当我启动它时,它工作得很好,响应也应该如此——但如果我让它坐着不从流中获取任何输入,它就会像僵尸一样。不会退出/退出,但也不会获取任何新数据 我认为我有理由解释超时,但很明显,要么我做得不对,要么这不是问题所在。我应该补充一点,我正在使用supervisord在Ubuntu中作为守护进程运行它 我已经确定了两种可能的解决方案,但想看看是

我正在构建一个我希望持续运行(始终打开/侦听)的bot,Tweepy twitter API StreamListener在一段时间后变得过时,并且变得没有响应

当我启动它时,它工作得很好,响应也应该如此——但如果我让它坐着不从流中获取任何输入,它就会像僵尸一样。不会退出/退出,但也不会获取任何新数据

我认为我有理由解释超时,但很明显,要么我做得不对,要么这不是问题所在。我应该补充一点,我正在使用supervisord在Ubuntu中作为守护进程运行它

我已经确定了两种可能的解决方案,但想看看是否有一种“正确”的方法。以下是我当前的设置(不包括运行良好的on_数据):

我找到的解决方案之一是在末尾循环侦听器块并检查stream.running,如果没有,则删除流并启动新的流。我相信使用
stream.running
然后使用
stream.disconnect()
这种方法的变体是每隔几分钟/小时循环一次提要,然后重新连接以保持在旧连接的顶部

但另一个stackoverflow帖子建议从以下位置执行try/except:

流维护是否有一个最佳实践,即:让它优雅地处理自己,或者通过每24小时关闭一次流并重新打开它来保持在流的顶部

tweepy的流式API有一些很好的文档,但没有任何真正好的示例。我还认为我可能应该使用async,因为这个bot将使用指定的hashtag响应tweet,并且我可能希望侦听器在它自己的线程中


提前谢谢。

也许你可以在
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"])
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