3

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

4 回答 4

4

来自:http ://man-wiki.net/index.php/3: curl_easy_setopt

CURLOPT_LOW_SPEED_LIMIT- 传递一个 long as 参数。它包含以每秒字节数为单位的传输速度,在几秒钟内传输应低于该速度,CURLOPT_LOW_SPEED_TIME以便库认为它太慢并中止。

CURLOPT_LOW_SPEED_TIME- 传递一个 long as 参数。它包含以秒为单位的传输时间应该低于 CURLOPT_LOW_SPEED_LIMIT库认为它太慢和中止的时间。


例子:

conn.setopt(pycurl.LOW_SPEED_LIMIT, 1)
conn.setopt(pycurl.LOW_SPEED_TIME, 90)
于 2012-10-21T03:06:06.790 回答
1

curl 开关 --speed-limit 允许您在传输速度在给定时间长度内低于给定阈值时让 curl 返回错误。不幸的是,速度阈值不能设置为小于 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 中的选项没有令人满意的解决方案。

于 2011-12-03T05:49:51.430 回答
0

我有一种预感,这可能与“tcp 断管”场景有关。即另一个对等点在某个时刻关闭了连接,但我们的对等点以某种方式忽略了该事件。您将需要使用某种保活来处理此问题。

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

于 2011-02-11T16:05:56.417 回答
0

您可以使用超时设置:

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

如果 curl 超时,您将收到 pycurl.error 异常。

于 2011-02-11T15:20:09.253 回答