2011-02-10 60 views
3

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

回答

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) 
0

可以使用超时设置:

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

你会得到一个pycurl.error异常,如果出卷曲倍。

+0

我怕你不明白Twitter的流API。该请求正在进行并保持开放几个小时。 – gnur 2011-02-11 15:22:19

0

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

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

+0

Twitter应该将空白行作为保持活动状态。所以,也许你需要有另一个线程保持倒计时,因为你最后从twitter获得一个包,并且如果在X时间内没有收到任何东西,就会中断主线程 – 2011-02-11 16:35:56

+0

@ʞɔıu,类似的东西。但请不要滥用线程:在curl api中查找超时选项。必须有一些东西。 – ulidtko 2011-02-11 16:38:23

1

卷曲开关 - 速度限制允许卷曲返回错误,如果传输速度在给定的时间长度内低于给定的阈值。不幸的是,速度阈值不能设置为小于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中的选项。