如何正确关闭tweepy流

时间:2012-12-31 15:05:48

标签: python multithreading tweepy

我正在试图弄清楚如何正确关闭异步的tweepy流。

可以找到tweepy流模块here

我像这样启动流:

stream = Stream(auth, listener)
stream.filter(track=['keyword'], async=True)

关闭应用程序时,我尝试关闭流,如下所示:

stream.disconnect()

此方法似乎按预期工作,但似乎有一个问题: 流线程仍然在循环的中间(等待/处理推文)并且直到下一个循环才被杀死,所以当流甚至在应用程序关闭后收到推文时,它仍然会尝试调用侦听器对象(这可以在侦听器对象上看到简单的打印语法。我不确定这是不是坏事,或者它是否可以简单地被忽略。

我有两个问题:

  1. 这是关闭流的最佳方式,还是应采取不同的方法?
  2. 不应该将异步线程创建为守护程序线程吗?

4 个答案:

答案 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 )