我正在使用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()
答案 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并遇到了同样的问题。