0

アップデート:

私はこれを回答済みから元に戻しました。これは、説得力のあるニックの回答で提示された解決策を試し、Googleの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が返されます)が、実行が戻ってこないようです。


こんにちは、みんな-

Twitterのストリーミング(別名ファイアホース)APIをGoogle App Engineで試してみようとしています(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は、urlfetchAPIの薄いラッパーです。何が起こっているかについては正しいです。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 に答える