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

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

CURLOPT_LOW_SPEED_LIMIT-longasパラメーターを渡します。これには、1秒あたりのバイト数で表された転送速度が含まれておりCURLOPT_LOW_SPEED_TIME、ライブラリが速度が遅すぎると見なして中止するには、転送速度が数秒未満である必要があります。

CURLOPT_LOW_SPEED_TIME-longasパラメーターを渡します。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は、存続のために30秒ごとに1文字を送信するため、理想的な値は1/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

タイムアウト設定を使用できます。

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

curlがタイムアウトすると、pycurl.error例外が発生します。

于 2011-02-11T15:20:09.253 に答える
0

これは「tcpbrokenpipe」シナリオに関連している可能性があるという予感があります。つまり、他のピアはある時点で接続を閉じますが、私たちのピアはどういうわけかイベントを無視します。これを処理するには、ある種のキープアライブを使用する必要があります。

問題の「正しい」エレガントな解決策には、Twitter自体からのアクションが必要になる場合があります。これはかなり一般的な問題です。私の友人はストリーミングAPIを使用していて、同じ問題に遭遇しました。

于 2011-02-11T16:05:56.417 に答える