16

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

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

我像这样开始流:

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

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

stream.disconnect()

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

我有两个问题:

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

4 回答 4

3

我有同样的问题。我通过重新启动脚本来修复它。Tweepy Stream 直到下一条传入推文才会停止。

例子:

import sys
import os

python=sys.executable

time.sleep(10)

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

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

于 2015-12-30T10:02:29.053 回答
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 建议的那样,您可以检查来源以确定。

于 2013-11-01T02:50:29.133 回答
0

这是设计使然。查看源代码,您会注意到断开连接没有立即终止选项。

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

调用 disconnect() 时,它只是设置 self.running = False,然后在_run 方法的下一个循环中检查

你可以忽略这个副作用。

于 2013-10-31T22:36:33.740 回答
-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 )
于 2017-02-27T13:49:08.230 回答