在Twitter流媒体api上处理pycurl挂起

时间:2011-02-10 16:45:27

标签: python curl twitter pycurl

我正在使用pycurl连接到twitter流API。

这很有效,但有时候在运行几个小时之后它会无限期地停止,不会抛出任何异常。如何在此脚本中检测/处理挂起?

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 个答案:

答案 0 :(得分:4)

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

  

CURLOPT_LOW_SPEED_LIMIT - 传递一个长参数。它包含   转移应该低于传输速度,以每秒字节数为单位   在CURLOPT_LOW_SPEED_TIME秒内,图书馆可以考虑它   太慢了并且中止了。

  

CURLOPT_LOW_SPEED_TIME - 传递一个长参数。它包含   转移时间应以秒为单位的时间   CURLOPT_LOW_SPEED_LIMIT让图书馆认为它太慢了   中止。


示例:

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

答案 1 :(得分:1)

如果传输速度在给定的时间长度内低于给定阈值,则卷曲开关--speed-limit允许卷曲返回错误。不幸的是,速度阈值不能设置为小于1的值,并且Twitter Streaming API的理想值将是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中的选项。

答案 2 :(得分:0)

您可以使用超时设置:

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

如果curl超时,你会得到一个pycurl.error异常。

答案 3 :(得分:0)

我预感到这可能与“tcp断管”情况有关。即在某个时刻,另一个同伴关闭了连接,但是我们的同伴忽略了这个事件。你将需要使用某种保持活动来解决这个问题。

问题的“正确”优雅解决方案可能需要Twitter本身的一些操作。这是一个相当普遍的问题;我的朋友使用了流式api并遇到了同样的问题。