2011-02-10 21 views
3

私はpycurlを使用して、TwitterストリーミングAPIに接続しています。TwitterのストリーミングAPIを処理するpycurlを処理する

これはうまく動作しますが、時には数時間実行した後、それは例外をスローしませ、無期限にハング停止します。このスクリプトでハングアップを検出/処理するにはどうすればよいですか?

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

0

これは "tcp broken pipe"シナリオに関連する可能性があるという予感があります。私。もう一方のピアは接続を閉じますが、ピアは何らかの形でこのイベントを無視します。あなたはこれを使っていくために何らかのキープアライブを使う必要があります。

問題の "適切な"優雅な解決方法は、Twitter自体からいくつかのアクションが必要な場合があります。これはむしろ一般的な問題です。私の友人は、ストリーミングAPIを使用して、同じ問題に遭遇しました。

+0

Twitterは空白行をキープアライブとして送信することになっています。twitterからパケットを最後に取得してからカウントダウンを続ける別のスレッドを持つ必要があります。何もXの時間量で受信していない場合はメインスレッドを中断します。 –

+0

@ʞɔıuなどです。しかし、スレッドを悪用しないでください:カールAPIのタイムアウトオプションを探してください。何かがあるはずです。 – ulidtko

1

カールスイッチ--speed制限を使用すると、転送速度が一定時間所定の閾値以下に下がる場合にエラーを返すカール有することを可能にします。残念ながら、速度しきい値は1未満の値に設定することはできません。TwitterストリーミングAPIの理想的な値は、キープアライブのために30秒ごとに1文字を送信するため、1/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 

要約すると、カールのオプションだけを使用する満足できる解決策はありません。

+0

'--libcurl'オプションを使って、与えられたコマンドラインオプションに対応するCコードを生成することができます。 pycurlでPythonに移植するのは簡単なはずです。 – jfs

関連する問題