0

更新:

当我尝试在有说服力的尼克的回答中提出的解决方案并切换到谷歌的 urlfetch 时,我将其从已回答切换回来:

logging.debug("starting urlfetch for http://%s%s" % (self.host, self.url))
result = urlfetch.fetch("http://%s%s" % (self.host, self.url), payload=self.body, method="POST", headers=self.headers, allow_truncated=True, deadline=5)
logging.debug("finished urlfetch")

但不幸finished urlfetch的是,它从未被打印出来——我在日志中看到了超时(它在 5 秒后返回 200),但执行似乎没有返回。


大家好-

我正在尝试使用 Google App Engine 使用 Twitter 的Streaming(又名 firehose)API(我知道这可能不是一个很好的长期游戏,因为您无法使用 GAE 永久打开连接),但是所以到目前为止,我还没有让我的程序真正解析 Twitter 返回的结果。

一些代码:

logging.debug("firing up urllib2")
req = urllib2.Request(url="http://%s%s" % (self.host, self.url), data=self.body, headers=self.headers)
logging.debug("called urlopen for %s %s, about to call urlopen" % (self.host, self.url))
fobj = urllib2.urlopen(req)
logging.debug("called urlopen")

不幸的是,当它执行时,我的调试输出永远不会显示called urlopen打印的行。我怀疑发生的事情是 Twitter 保持连接打开并且 urllib2 没有返回,因为服务器没有终止连接。

Wireshark 显示正确发送的请求以及返回结果的响应。

我尝试添加Connection: close到我的请求标头,但这并没有产生成功的结果。

关于如何让它发挥作用的任何想法?

4

1 回答 1

1

App Engine 上的 urllib 是urlfetch API的精简包装器。你对正在发生的事情是对的:Twitter 的流 API 永远不会终止它的响应,所以它会超时,并且 urlfetch 会抛出一个异常。

如果直接使用 urlfetch,可以设置超时时间(最长 10 秒),设置 allow_truncated 为 True 可以得到部分结果。不过,Twitter 流 API 确实不适合 App Engine,因为 App Engine 请求的执行时间被限制为 30 秒,而 urlfetch 请求不能逐步发回结果,或者需要超过 10 秒。使用 Twitter 的“标准”API 将是一个更好的选择。

于 2010-03-30T09:37:10.943 回答