我正在试图弄清楚如何正确关闭异步的tweepy流。
可以找到tweepy流模块here。
我像这样启动流:
stream = Stream(auth, listener)
stream.filter(track=['keyword'], async=True)
关闭应用程序时,我尝试关闭流,如下所示:
stream.disconnect()
此方法似乎按预期工作,但似乎有一个问题: 流线程仍然在循环的中间(等待/处理推文)并且直到下一个循环才被杀死,所以当流甚至在应用程序关闭后收到推文时,它仍然会尝试调用侦听器对象(这可以在侦听器对象上看到简单的打印语法。我不确定这是不是坏事,或者它是否可以简单地被忽略。
我有两个问题:
答案 0 :(得分:3)
我遇到了同样的问题。我通过重新启动脚本来修复它。 Tweepy Stream直到下一张传入的推文才会停止。
示例:
import sys
import os
python=sys.executable
time.sleep(10)
print "restart"
os.execl(python,python,*sys.argv)
我没有找到另一种解决方案。
答案 1 :(得分:2)
我不肯定它适用于您的情况,但一般情况下,您可以将适用的实体放在with
块之后进行清理:
with stream = Stream(auth, listener):
stream.filter(track=['keyword'], async=True)
# ...
# Outside the with-block; stream is automatically disposed of.
“处理”实际上意味着实体__exit__
的功能被调用
据推测,tweepy会超越“做正确的事”
正如@VooDooNOFX建议的那样,您可以检查来源以确定。
答案 2 :(得分:0)
这是设计的。 Looking at the source,您会注意到断开连接没有立即终止选项。
def disconnect(self):
if self.running is False:
return
self.running = False
当调用disconnect()时,它只是设置self.running = False,然后在_run method的下一个循环中检查
您可以忽略此副作用。
答案 3 :(得分:-1)
正如@burkay建议的那样,我最终删除了Stream对象并开始了一个新对象,而不是重新启动脚本。在我的示例中,有人想要添加要跟踪的新用户,因此我以这种方式更新曲目列表:
stream.disconnect() # that should wait until next tweet, so let's delete it
del stream
# now, create a new object
stream = tweepy.Stream( auth=api.auth, listener=listener )
stream.userstream( track=all_users(), async=True )