2012-12-31 24 views
12

Próbuję dowiedzieć się, jak poprawnie zamknąć asynchroniczny strumień tweepy.jak poprawnie zamknąć strumień tweepy

Moduł przesyłania strumieniowego tweepy można znaleźć here.

zacznę strumień tak:

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

Podczas zamykania aplikacji, staram się zamknąć strumienia tak proste, jak:

stream.disconnect() 

Metoda ta wydaje się działać zgodnie z przeznaczeniem, ale wydaje mieć jeden problem: wątek strumienia jest nadal w środku pętli (oczekujące/obsługujące tweety) i nie jest zabijany aż do następnej pętli, więc gdy strumień otrzyma tweeta nawet po zamknięciu aplikacji, nadal próbuje wywołaj obiekt detektora (można to zobaczyć za pomocą prosta składnia wydruku w obiekcie słuchacza). Nie jestem pewien, czy to jest złe, czy może być po prostu ignorowane.

mam 2 pytania:

  1. Jest to najlepszy sposób, aby zamknąć strumienia lub należy przyjąć inne podejście?
  2. Czy wątek asynchroniczny nie powinien być tworzony jako wątek demona?
+1

Dlaczego nie używać Twython?Jest to oficjalna biblioteka Pythona na Twitterze. –

Odpowiedz

0

Jest to zgodne z projektem. Looking at the source, zauważysz, że rozłączenie nie ma opcji natychmiastowego zakończenia.

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

Dzwoniąc Disconnect(), to po prostu ustawia self.running = False, który następnie jest sprawdzany na następnej pętli _run method

można zignorować ten efekt uboczny.

2

nie jestem przekonany, że to odnosi się do sytuacji, ale w ogóle można mieć zastosowanie podmioty posprzątać po sobie, umieszczając je w with bloku:

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

Co „zbyte” w rzeczywistości oznacza, , że wywoływana jest funkcja encji __exit__.
Prawdopodobnie tweepy zastąpi to, aby zrobić właściwą rzecz.
Zgodnie z sugestią @VooDooNOFX, możesz sprawdzić źródło, aby się upewnić.

3

Miałem ten sam problem. Naprawiłem to, uruchamiając ponownie skrypt. Tweepy Stream nie zatrzymuje się do następnego przychodzącego tweeta.

przykład:

import sys 
import os 

python=sys.executable 

time.sleep(10) 

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

nie znaleźć inne rozwiązanie.

-1

Zamiast restartować skrypt, jak sugeruje @burkay, w końcu usunąłem obiekt Stream i uruchomiłem nowy. W moim przykładzie ktoś chce dodać nowego użytkownika, którego należy przestrzegać, więc aktualizuję listę ścieżek w ten sposób:

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)