2012-02-21 3 views
2

私はスタックとしてnginx、web.py、fastcgi、およびredisを使用しています。Pythonで時間をms単位で測定し、しきい値が満たされた場合に中止する

私はレスポンスを返すために120ミリ秒かかるので、私はいつもレスポンスを測定する必要があります。閾値に近づくには、中止してFalseを返す必要があります。もし私が120の閾値を超えた場合に限り、真実か偽であれば処罰されません。私は10-50K qpsを期待しています。

私は単純に条件を満たすことができますが、長時間実行しているプロセスが懸念されています。終了するまで待つ必要があります。私はパイプライニングを使用しているredisコール。例えば、

start = time.time() 
r.get() 
end = time.time - start 
if end>115 then return False 

もしもr.get()が、私は罰金を科せられます。

時間を監視し、監視プロセスなしでアボート信号を送信するには、あまりにも多くのリソースを消費しないでください。スレッドを起動しますか?

タイムアウトを使用しますか?もしそうなら、MSの範囲でどうですか?

おかげ

+1

これはシングルスレッドプログラムで、POSIXを使用している場合はシグナルを使用できます。そうでない場合は、タイムアウトをチェックするために別のスレッドが必要になります。ここで問題となるのは、リクエストスレッドが長時間かかると「中止」することができないということです。それは問題だろうか? –

+0

こんにちは、まあ...私はちょうど時間がかかる場合はfalseを返す必要があります。しかし、スレッドが終了するのを待つことができます。理にかなっている? – Tampa

+0

また、プログラムはシングルスレッドです。 – Tampa

答えて

2

これはPythonでdecoratorのために良い使用です。誰かが既にあなたがこの方法を使用することができます@timeout decorator書かれています:

@timeout(timeout=2) 
def return_later(): 
    time.sleep(3) 
    return 'later' 

睡眠時間>タイムアウト、代わりに返すの「後で」それは意志世代例外導入されたバージョン:

Traceback (most recent call last): 
    ... 
TimeoutException 

しかし実装の使用しているため、 signal.alarm()にはintしかかかりませんが、1秒単位で、秒単位で指定することはできません。あなたがミリ秒を使用したいと思うので、signal.setitimer()を使用するようにこのデコレータを適応させることができます。もしあなたが勇気があるならば、より良い解決方法は、よりも使用が簡単で、マイクロ秒の解像度を提供するualarm()をサポートするsignalモジュールへのsubmit a patch the way someone did to implement setitimer functionalityです。

+1

これは、デコレータを使い、エラーをキャッチしようとすると聞こえますが、エラーがキャッチされた場合はデフォルト値を返します。 –

+1

本当に素晴らしいです。私はsignal.alarm(self.timeout)をsignal.setitimer(signal.ITIMER_REAL、self.timeout)に置き換えました。素晴らしい仕事を! – Tampa

関連する問題