Обрабатывать Pycurl повесить на Twitter потокового API - PullRequest
3 голосов
/ 10 февраля 2011

Я использую pycurl для подключения к потоковому API Twitter.

Это работает хорошо, но иногда после нескольких часов работы он перестает зависать на неопределенный срок, не вызывая никаких исключений. Как я могу обнаружить / обработать зависание в этом скрипте?

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()

Ответы [ 4 ]

4 голосов
/ 21 октября 2012

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

CURLOPT_LOW_SPEED_LIMIT - передать длинную как параметр,Он содержит скорость передачи в байтах в секунду, которая должна быть ниже в течение CURLOPT_LOW_SPEED_TIME секунд, чтобы библиотека считала ее слишком медленной и прервала.

и

CURLOPT_LOW_SPEED_TIME - передать long как параметр.Он содержит время в секундах, в течение которого передача должна быть ниже CURLOPT_LOW_SPEED_LIMIT, чтобы библиотека считала его слишком медленным и прерванным.


Пример:

conn.setopt(pycurl.LOW_SPEED_LIMIT, 1)
conn.setopt(pycurl.LOW_SPEED_TIME, 90)
1 голос
/ 03 декабря 2011

Переключатель curl --speed-limit позволяет curl возвращать ошибку, если скорость передачи падает ниже заданного порогового значения в течение заданного промежутка времени.К сожалению, порог скорости не может быть установлен на значения меньше единицы, и идеальным значением для API потоковой передачи Twitter будет 1/30, так как он отправляет один символ каждые 30 секунд для его поддержки.Лучшее, что вы можете сделать, это использовать порог в 1 Bps, но тогда curl будет сдаваться всякий раз, когда есть период бездействия (без твитов), превышающий выбранную вами продолжительность.Приведенная ниже команда будет сдана, если есть 30-секундный период, в течение которого она получает менее 30 байтов.

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

Подводя итог: нет удовлетворительного решения, используя только опции в curl.

0 голосов
/ 11 февраля 2011

У меня есть предчувствие, что это может быть связано со сценарием "tcp broken pipe".Т.е. другой узел в какой-то момент закрывает соединение, но наш узел как-то игнорирует событие.Для этого вам нужно будет использовать какие-то средства поддержки активности.

«Правильное», элегантное решение проблемы может потребовать некоторых действий от самого твиттера.Это довольно распространенная проблема;мой друг использовал потоковое API и столкнулся с той же проблемой.

0 голосов
/ 11 февраля 2011

Вы можете использовать настройки тайм-аута:

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

Вы получите исключение pycurl.error, если время ожидания curl истекло.

...