处理pycurl在Twitter streaming API上的挂起问题

3 投票
4 回答
1995 浏览
提问于 2025-04-16 11:35

我正在使用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)

撰写回答