2011-02-10 6 views
3

J'utilise pycurl pour se connecter à l'API de streaming twitter.Poignée pycurl accrocher sur Twitter streaming api

Cela fonctionne bien, mais parfois après avoir couru pendant quelques heures, il cessera de bloquer indéfiniment, ne pas jeter aucune exception. Comment puis-je détecter/gérer un blocage dans ce script?

import pycurl, json 

STREAM_URL = "http://stream.twitter.com/1/statuses/filter.json" 

USER = "presidentskroob" 
PASS = "12345" 

def on_receive(data): 
    print data 

conn = pycurl.Curl() 
conn.setopt(pycurl.USERPWD, "%s:%s" % (USER, PASS)) 
conn.setopt(pycurl.URL, STREAM_URL) 
conn.setopt(pycurl.WRITEFUNCTION, on_receive) 
conn.perform() 

Répondre

4

DE: http://man-wiki.net/index.php/3:curl_easy_setopt

CURLOPT_LOW_SPEED_LIMIT - Passe un long comme paramètre. Il contient la vitesse de transfert en octets par seconde que le transfert doit être inférieure à pendant CURLOPT_LOW_SPEED_TIME secondes pour la bibliothèque de le considérer trop lent et interrompra.

et

CURLOPT_LOW_SPEED_TIME - Passe un long comme paramètre. Il contient le temps en quelques secondes que le transfert doit être inférieur à la CURLOPT_LOW_SPEED_LIMIT pour la bibliothèque de le considérer trop lent et abort.


Exemple:

conn.setopt(pycurl.LOW_SPEED_LIMIT, 1) 
conn.setopt(pycurl.LOW_SPEED_TIME, 90) 
0

Vous pouvez utiliser les paramètres de temporisation:

conn.setopt(pycurl.CONNECTTIMEOUT, 15) 
conn.setopt(pycurl.TIMEOUT, 25) 

Vous obtiendrez une exception pycurl.error si le temps papillotes sur.

+0

Je crains que vous ne comprenez pas l'API de streaming Twitter. La demande est en cours et reste ouverte pendant des heures. – gnur

0

J'ai la prémonition que cela pourrait être lié au scénario "TPC tuyau brisé". C'est à dire. l'autre pair ferme à un certain moment la connexion, mais notre pair ignore en quelque sorte l'événement. Vous aurez besoin d'utiliser une sorte de keep-alives pour se défouler avec cela.

La «bonne» solution élégante du problème peut nécessiter certaines actions de la part de twitter lui-même. C'est un problème plutôt commun; mon ami a utilisé l'API de streaming et a rencontré le même problème.

+0

Twitter est censé envoyer des lignes vides en tant que keep-alive.Alors peut-être vous avez besoin d'avoir un autre thread qui tient un compte à rebours depuis que vous avez reçu un paquet de twitter et interrompt le thread principal si rien n'a été reçu dans X temps –

+0

@ ʞɔıu, quelque chose comme ça. Mais s'il vous plaît ne pas abuser des discussions: recherchez les options de délai dans l'API. Il doit y avoir quelque chose. – ulidtko

1

Le commutateur boucle limite --speed vous permet d'recourbées retourner une erreur si la vitesse de transfert plonge en dessous d'un seuil donné pour une durée donnée. Malheureusement, le seuil de vitesse ne peut pas être défini à des valeurs inférieures à un, et la valeur idéale pour l'API Twitter Streaming serait de 1/30, car il envoie un seul caractère toutes les 30 secondes pour son maintien en vie. Le mieux que vous puissiez faire est d'utiliser un seuil de 1 Bps, mais ensuite le curl sera abandonné chaque fois qu'il y aura une période d'inactivité (pas de tweets) plus longue que la durée que vous aurez choisie. La commande ci-dessous abandonnera s'il y a une période de 30 secondes au cours de laquelle elle reçoit moins de 30 octets.

curl -d @filter.txt https://stream.twitter.com/1/statuses/filter.json -uTwitterLogin:TwitterPassword --speed-time 30 --speed-limit 1 

En résumé: pas de solution satisfaisante en utilisant seulement les options de curl.

+0

vous pouvez utiliser l'option '--libcurl' pour générer du code C qui correspond aux options command-lien données. Il devrait être simple de le porter en Python avec pycurl. – jfs

Questions connexes