处理pycurl在Twitter streaming API上的挂起问题
我正在使用pycurl来连接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 个回答
0
你可以使用超时设置:
conn.setopt(pycurl.CONNECTTIMEOUT, 15)
conn.setopt(pycurl.TIMEOUT, 25)
如果curl超时了,你会收到一个pycurl.error的异常错误。
1
curl这个工具有一个选项叫做--speed-limit,它可以让你设置一个速度限制。如果传输速度低于这个限制一段时间,curl就会返回一个错误。不过,速度限制不能设置得太低,至少要大于1。对于Twitter的流媒体API来说,理想的速度限制是1/30,因为它每30秒只发送一个字符来保持连接活跃。你能做的最好的设置是1字节每秒,但这样的话,只要有超过你设定的时间没有收到数据(比如没有新推文),curl就会放弃。下面的命令会在30秒内收到的数据少于30字节时放弃。
curl -d @filter.txt https://stream.twitter.com/1/statuses/filter.json -uTwitterLogin:TwitterPassword --speed-time 30 --speed-limit 1
总结一下:仅用curl的选项无法找到一个令人满意的解决方案。
4
来源: 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)