把pycurl挂在Twitter流式API上
我正在使用pycurl连接到Twitter流式API。把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()
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)
可以使用超时设置:
conn.setopt(pycurl.CONNECTTIMEOUT, 15)
conn.setopt(pycurl.TIMEOUT, 25)
你会得到一个pycurl.error异常,如果出卷曲倍。
我有一个预感,这可能与“tcp断管”情况有关。即另一方在某个时刻关闭了连接,但我们的同伴以某种方式忽略了该事件。你将需要使用某种保持活力来解决这个问题。
问题的“正确”,优雅的解决方案可能需要twitter本身的一些操作。这是一个相当普遍的问题;我的朋友使用了流API,遇到了同样的问题。
Twitter应该将空白行作为保持活动状态。所以,也许你需要有另一个线程保持倒计时,因为你最后从twitter获得一个包,并且如果在X时间内没有收到任何东西,就会中断主线程 – 2011-02-11 16:35:56
@ʞɔıu,类似的东西。但请不要滥用线程:在curl api中查找超时选项。必须有一些东西。 – ulidtko 2011-02-11 16:38:23
卷曲开关 - 速度限制允许卷曲返回错误,如果传输速度在给定的时间长度内低于给定的阈值。不幸的是,速度阈值不能设置为小于1的值,并且Twitter Streaming API的理想值为1/30,因为它每隔30秒发送一个字符以保持活动状态。你可以做的最好的是使用1 Bps的阈值,但是如果有一段时间不活动(不鸣叫)比选择的时间更长,那么卷曲就会放弃。如果在30秒内收到的字节数少于30字节,下面的命令将放弃。
curl -d @filter.txt https://stream.twitter.com/1/statuses/filter.json -uTwitterLogin:TwitterPassword --speed-time 30 --speed-limit 1
总结:没有令人满意的解决方案,只使用curl中的选项。
我怕你不明白Twitter的流API。该请求正在进行并保持开放几个小时。 – gnur 2011-02-11 15:22:19