Python 如何正确关闭tweepy流

Python 如何正确关闭tweepy流,python,multithreading,tweepy,Python,Multithreading,Tweepy,我试图弄清楚如何正确地关闭异步tweepy流 可以找到tweepy流媒体模块 我以如下方式启动流: stream = Stream(auth, listener) stream.filter(track=['keyword'], async=True) 关闭应用程序时,我尝试关闭流,如下所示: stream.disconnect() 此方法似乎按预期工作,但似乎有一个问题: 流线程仍然处于循环(等待/处理消息)的中间,并且直到下一个循环才被杀死,所以当流在应用程序关闭后接收到twitt时,它

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

可以找到tweepy流媒体模块

我以如下方式启动流:

stream = Stream(auth, listener)
stream.filter(track=['keyword'], async=True)
关闭应用程序时,我尝试关闭流,如下所示:

stream.disconnect()
此方法似乎按预期工作,但似乎有一个问题: 流线程仍然处于循环(等待/处理消息)的中间,并且直到下一个循环才被杀死,所以当流在应用程序关闭后接收到twitt时,它仍然试图调用侦听器对象(这可以通过监听器对象上的简单打印语法来看到)。我不确定这是一件坏事还是可以忽略

我有两个问题:

  • 这是关闭流的最佳方法还是我应该采取不同的方法
  • 异步线程不应该创建为守护进程线程吗
  • 这是故意的,您会注意到断开连接没有立即终止选项

    def disconnect(self):
        if self.running is False:
            return
        self.running = False
    
    调用disconnect()时,它只会设置self.running=False,然后在


    您可以忽略此副作用。

    我不确定它是否适用于您的情况,但一般来说,您可以通过将适用实体放入带有
    块中,让它们自行清理:

    with stream = Stream(auth, listener):
        stream.filter(track=['keyword'], async=True)
        # ...
    # Outside the with-block; stream is automatically disposed of.
    
    “disposed of”的实际含义是,调用实体
    \uuuuuuuuuuuuuuuuuuuuuu
    函数。
    据推测,特威比会超越这一点,做正确的事情。

    正如@VooDooNOFX所建议的,您可以检查源代码以确保。

    我也有同样的问题。我通过重新启动脚本修复了它。Tweepy流直到下一条传入tweet才停止

    例如:

    import sys
    import os
    
    python=sys.executable
    
    time.sleep(10)
    
    print "restart"
    os.execl(python,python,*sys.argv)
    

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

    我没有像@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 )
    

    为什么不改用特威顿呢?它是Twitter上Python的官方库。