2012-12-31 40 views
12

Asenkron eş zamanlı tweepy akışının nasıl düzgün şekilde kapatılacağını anlamaya çalışıyorum.Tweepy akışının nasıl düzgün şekilde kapatılacağı

Tweepy akış modülü here bulunabilir. Uygulamayı kapatırken

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

, ben gibi basit akışını kapatmak için deneyin:

böyle akışı başlatmak

stream.disconnect() 

Bu yöntem amaçlandığı şekilde iş gibi görünüyor ama öyle görünüyor bir sorun olması için: akış iş parçacığı hala döngü ortasında (bekleme/işleme tweets) ve sonraki döngü kadar öldürmez, böylece uygulama kapatıldıktan sonra bile bir tweet aldığında, hala çalışır dinleyici nesnesini çağır (bu dinleyici nesnesinde basit bir yazım sözdizimi). Bunun kötü bir şey mi yoksa sadece göz ardı edilip edilmeyeceğinden emin değilim. Ben 2 soru var

:

  1. bu akışı kapatmak için ya da ben farklı bir yaklaşım almalı iyi yolu var mı?
  2. Eşzamansız iş parçacığı bir daemon iş parçacığı olarak oluşturulmamalıdır?
+1

Neden Twython kullanmıyorsunuz?Twitter'dan Python resmi kütüphanesi. –

cevap

0

Bu, tasarım gereğidir. Looking at the source, bağlantı kesme işleminin anında sonlandırma seçeneği olmadığını fark edeceksiniz.) (Bağlantı kesme ararken

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

, sadece o zaman bu yan etkiyi göz ardı edebilirsiniz _run method

sonraki döngü kontrol edilir self.running = False, ayarlar.

2

Ben durumunuza için geçerli olduğunu değil olumlu değilim, ama genel olarak bir with bloğunda koyarak uygulanabilir kişiler kendilerini sonra temizlemek sahip olabilir:

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

Ne "elden çıkarılan" aslında demektir Bu, __exit__ varlıklarının çağrıldığı işlevdir.
Muhtemelen korkunç şeyler Doğru Şeyi Yapmak için bunu geçersiz kılacaktır.
@VooDooNOFX'in önerdiği gibi, emin olmak için kaynağı kontrol edebilirsiniz.

3

Aynı problem vardı. Komut dosyasını yeniden başlatırken onu tamir ettim. Tweepy Stream bir sonraki tweet'e kadar durmaz.

Örnek:

import sys 
import os 

python=sys.executable 

time.sleep(10) 

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

ben başka bir çözüm bulamadık.

-1

Komutu yeniden başlatmak yerine, @burkay'ın önerdiği gibi, sonunda Stream nesnesini sildim ve yeni bir tane başlattım. Örneğimde, birisi takip edilecek yeni bir kullanıcı eklemek istiyor, bu yüzden parça listesini şu şekilde güncelliyorum:

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) 
İlgili konular