如何正确关闭 tweepy 流

17

我正在努力找出如何正确关闭异步的tweepy流。

tweepy流模块可以在这里找到。

我是这样启动流的:

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

关闭应用程序时,我尝试以简单的方式关闭流:

stream.disconnect()

这种方法似乎按预期工作,但它似乎存在一个问题:流线程仍处于循环的中间(等待/处理推文),并且直到下一次循环之前不会被终止,因此即使在应用程序关闭后,当流接收到推文时,它仍然尝试调用侦听器对象(可以通过对侦听器对象使用简单的打印语法来查看)。我不确定这是否是一件坏事,或者是否可以简单地忽略它。

我的2个问题:

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

1
为什么不使用Twython呢?它是Twitter官方的Python库。 - Games Brainiac
4个回答

3

我遇到了同样的问题。我通过重新启动脚本来解决它。Tweepy Stream不会停止,直到下一个推文到达。

例子:

import sys
import os

python=sys.executable

time.sleep(10)

print "restart"
os.execl(python,python,*sys.argv)

我没有找到其他的解决方案。


2

我不确定它是否适用于您的情况,但通常您可以通过将适用的实体放入with块中来使其自我清理:

with stream = Stream(auth, listener):
    stream.filter(track=['keyword'], async=True)
    # ...
# Outside the with-block; stream is automatically disposed of.

"Disposed of"实际上是指调用实体的__exit__函数。可以假定tweepy已经重写了该函数以执行正确的操作。如@VooDooNOFX所建议的,您可以检查源代码以确保这一点。"

0

这是故意的。查看源代码, 你会注意到disconnect没有立即终止选项。

def disconnect(self):
    if self.running is False:
        return
    self.running = False

当调用disconnect()时,它只是简单地将self.running = False设置为假,然后在_run方法的下一个循环中进行检查。

您可以忽略此副作用。


0

与其像@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 )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接