Wie zu stoppen, zu töten, zu stoppen oder schließen Sie eine PycURL-Anfrage in einem Stream Beispiel mit Twitter Stream gegeben

Im derzeit CURLing der Twitter-API-Stream (http://stream.twitter.com/1/statuses/sample.json), so bin ständig erhalten Daten. Ich möchte den CURLing den Stream stoppen, sobald ich X Anzahl von Objekten aus ihm abgerufen habe (im Beispiel gebe ich 10 als beliebige Nummer).

Sie können sehen, wie ich versucht habe, die Verbindung im folgenden Code zu schließen. Der Code unter curling.perform () wird nie ausgeführt, aufgrund der Tatsache, dass es sich um einen kontinuierlichen Datenstrom handelt. Also habe ich versucht, den Stream im body_callback zu schließen, aber da perform () läuft derzeit kann ich nicht aufrufen ().

Jede Hilfe wäre willkommen.

Code:

# Imports import pycurl # Used for doing cURL request import base64 # Used to encode username and API Key import json # Used to break down the json objects # Settings to access stream and API userName = 'twitter_username' # My username password = 'twitter_password' # My API Key apiURL = 'http://stream.twitter.com/1/statuses/sample.json' # the twitter api tweets = [] # An array of Tweets # Methods to do with the tweets array def how_many_tweets(): print 'Collected: ',len(tweets) return len(tweets) class Tweet: def __init__(self): self.raw = '' self.id = '' self.content = '' def decode_json(self): return True def set_id(self): return True def set_content(self): return True def set_raw(self, data): self.raw = data # Class to print out the stream as it comes from the API class Stream: def __init__(self): self.tweetBeingRead ='' def body_callback(self, buf): # This gets whole Tweets, and adds them to an array called tweets if(buf.startswith('{"in_reply_to_status_id_str"')): # This is the start of a tweet # Added Tweet to Global Array Tweets print 'Added:' # Priniting output to console print self.tweetBeingRead # Printing output to console theTweetBeingProcessed = Tweet() # Create a new Tweet Object theTweetBeingProcessed.set_raw(self.tweetBeingRead) # Set its raw value to tweetBeingRead tweets.append(theTweetBeingProcessed) # Add it to the global array of tweets # Start processing a new tweet self.tweet = buf # Start a new tweet from scratch else: self.tweetBeingRead = self.tweetBeingRead+buf if(how_many_tweets()>10): try: curling.close() # This is where the problem lays. I want to close the stream except Exception as CurlError: print ' Tried closing stream: ',CurlError # Used to initiate the cURLing of the Data Sift streams datastream = Stream() curling = pycurl.Curl() curling.setopt(curling.URL, apiURL) curling.setopt(curling.HTTPHEADER, ['Authorization: '+base64.b64encode(userName+":"+password)]) curling.setopt(curling.WRITEFUNCTION, datastream.body_callback) curling.perform() # This is cURLing starts print 'I cant reach here.' curling.close() # This never gets called. :( 

  • Töten mit python
  • Wie gebe ich einen Prozess ab?
  • Ctrl-c ie KeyboardInterrupt, um Threads in Python zu töten
  • Sauberes Herunterfahren eines Python-Skripts
  • Simulieren Sie den Ctrl-C-Tastaturalarm in Python, während Sie unter Linux arbeiten
  • Kill-Prozess mit Namen?
  • Töte subprocess.call nach KeyboardInterrupt
  • Python: Führen Sie einen Prozess und töten Sie es, wenn es nicht innerhalb einer Stunde enden
  • One Solution collect form web for “Wie zu stoppen, zu töten, zu stoppen oder schließen Sie eine PycURL-Anfrage in einem Stream Beispiel mit Twitter Stream gegeben”

    Sie können den Schreibrückruf abbrechen, indem Sie eine Nummer zurückgeben, die nicht die gleiche Menge ist, wie sie an sie weitergegeben wurde. (Standardmäßig handelt es sich um die Rücksendung 'Nichts' gleich wie die Rückgabe der gleichen Nummer, wie es an sie weitergegeben wurde)

    Wenn du es abbruchst, wird die gesamte Übertragung als erledigt betrachtet und dein perform () Anruf kehrt richtig zurück.

    Diese Übertragung wird dann einen Fehler zurückgeben, da die Übertragung abgebrochen wurde.

    Python ist die beste Programmiersprache der Welt.