2012-12-31 29 views
12

我想弄清楚如何正確關閉異步tweepy流。如何正確關閉tweepy流

tweepy streaming模塊可以找到here

我開始流是這樣的:

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

當關閉應用程序,我試圖關閉流簡單:

stream.disconnect() 

這種方法似乎意在工作,但它似乎有一個問題: 流線程仍然處於循環中間(等待/處理推文),並且直到下一個循環才被殺死,所以即使在應用程序關閉後流仍然會收到推文,它仍會嘗試調用監聽器對象(這可以看出來監聽器對象上的簡單打印語法)。我不確定這是一件壞事,還是可以忽略它。

我有2個問題:

  1. 這是關閉流,或者我應該採取不同的方法的最佳方式?
  2. 不應該將異步線程創建爲守護線程?
+1

爲什麼不使用Twython呢?它是來自Twitter的Python官方庫。 –

回答

0

這是設計。 Looking at the source,您會注意到斷開連接沒有立即終止選項。

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

當調用斷開(),它只是設置self.running =假,然後上的_run method

可以忽略這個副作用下一循環檢查。

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建議,您可以檢查來源確定。

3

我有同樣的問題。我通過重新啓動腳本來修復它。 Tweepy Stream不會停止,直到下一個傳入的tweet。

例子:

import sys 
import os 

python=sys.executable 

time.sleep(10) 

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

我沒有找到另一種解決方案。

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