2012-12-31 12 views
12

को ठीक से कैसे बंद करें, मैं यह समझने की कोशिश कर रहा हूं कि एसिंक्रोनस ट्वीपी स्ट्रीम को सही तरीके से कैसे बंद किया जाए।एक ट्वीपी स्ट्रीम

ट्वीपी स्ट्रीमिंग मॉड्यूल here पाया जा सकता है।

मैं इस तरह धारा शुरू:

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

जब अनुप्रयोग को बंद, मैं धारा के रूप में सरल रूप में बंद करने के लिए प्रयास करें:

stream.disconnect() 

इस विधि उद्देश्य के अनुसार कार्य करने लगता है लेकिन ऐसा लगता है एक समस्या है: स्ट्रीम थ्रेड अभी भी लूप (प्रतीक्षा/हैंडलिंग ट्वीट्स) के बीच में है और अगले लूप तक नहीं मारा जाता है, इसलिए जब ऐप बंद होने के बाद भी स्ट्रीम को ट्वीट प्राप्त होता है, तो यह अभी भी कोशिश करता है श्रोता वस्तु को कॉल करें (इसे देखा जा सकता है श्रोता वस्तु पर एक साधारण प्रिंट वाक्यविन्यास)। मुझे यकीन नहीं है कि यह एक बुरी चीज है या अगर इसे आसानी से अनदेखा किया जा सकता है।

2 प्रश्न हैं:

  1. इस का सबसे अच्छा तरीका धारा बंद करने के लिए या मैं एक अलग दृष्टिकोण रखना चाहिए है?
  2. क्या एसिंक थ्रेड को डिमन थ्रेड के रूप में नहीं बनाया जाना चाहिए?
+1

इसके बजाय Twython का उपयोग क्यों नहीं करें?ट्विटर से पाइथन के लिए यह आधिकारिक पुस्तकालय है। –

उत्तर

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

मुझे एक ही समस्या थी। मैंने स्क्रिप्ट को पुनरारंभ करने के साथ इसे ठीक किया। ट्वीवे स्ट्रीम अगले आने वाले ट्वीट तक नहीं रुकता है।

उदाहरण:

import sys 
import os 

python=sys.executable 

time.sleep(10) 

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

मैं एक और समाधान नहीं मिला।

-1

स्क्रिप्ट को पुनरारंभ करने के बजाय, जैसा कि @ बुर्के सुझाव देते हैं, मैंने आखिरकार स्ट्रीम ऑब्जेक्ट को हटा दिया और एक नया शुरू किया। मेरे उदाहरण में, कोई अनुसरण करने के लिए एक नया उपयोगकर्ता जोड़ना चाहता है, इसलिए मैं ट्रैक सूची को इस तरह अद्यतन करता हूं:

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)