16

非同期の tweepy ストリームを適切に閉じる方法を見つけようとしています。

tweepy ストリーミング モジュールは、ここにあります。

次のようにストリームを開始します。

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

アプリケーションを閉じるときは、次のように簡単にストリームを閉じようとします:

stream.disconnect()

このメソッドは意図したとおりに動作するように見えますが、1 つの問題があるようです: ストリーム スレッドはまだループの途中 (ツイートの待機/処理) にあり、次のループまで強制終了されません。アプリは終了しましたが、引き続きリスナー オブジェクトを呼び出そうとします (これは、リスナー オブジェクトの単純な出力構文で確認できます)。これが悪いことなのか、単に無視できるのかはわかりません。

2 つの質問があります。

  1. これがストリームを閉じる最善の方法ですか、それとも別のアプローチを取る必要がありますか?
  2. 非同期スレッドをデーモン スレッドとして作成するべきではありませんか?
4

4 に答える 4

3

私も同じ問題を抱えていました。スクリプトを再起動して修正しました。Tweepy ストリームは、次の着信ツイートまで停止しません。

例:

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 はそれをオーバーライドして Do The Right Thing を実行します。
@VooDooNOFXが示唆するように、ソースを確認してください。

于 2013-11-01T02:50:29.133 に答える
0

これは仕様によるものです。source を見ると、 disconnect には即時終了オプションがないことがわかります。

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 に答える