2017-10-20 6 views
0

私は100/sに呼を制限するケースがあります。Google RateLimiter not counterのために働いています

私はGoogle Guava RateLimiterを使用することを考えています。私はこれを次のようにテストしました: -

int cps = 100; 
    RateLimiter limiter = RateLimiter.create(cps); 
for(int i=0;i<200;i++) { 
    limiter.acquire(); 
    System.out.print("\rNumber of records processed = " + i+1); 
} 

しかし、コードは100レコードで終了して1秒が完了することはありませんでした。私は何か間違っているのですか?

答えて

5

レートリミッタが正常に動作しています。問題は、毎回フラッシュしていないため、出力がバッファされていることです。通常、標準出力はラインバッファです。だから、あなたが持っているもの、あなたはしかし、100で一時停止を見ているだろう

System.out.println("Number of records processed = " + (i+1)); 

を記述した場合:

System.out.print( "処理されたレコードの\ rNumber =" + I + 1) ;

には2つの問題があります。最初に、 "\ r"は新しい行として取り込まれず、フラッシュを引き起こさない。したがって、出力全体がバッファリングされ、コンソールに一度に印刷されます。次に、(i + 1)をかっこで囲む必要があります。あなたが持っているものは、文字列にiを追加し、結果の文字列に1を追加します。 DodgyCodeExceptionの提案出力フラッシュに関すると+1を連結@ほかに

2

、あなたはどのようにRateLimiter作品理解を確認するために、このコードを実行してみましょう:

final double permitsPerSecond = 1; 
RateLimiter limiter = RateLimiter.create(permitsPerSecond); 
final Stopwatch stopwatch = Stopwatch.createStarted(); 
int i = 0; 
for (; i < 2 * permitsPerSecond; i++) { 
    limiter.acquire(); 
} 
System.out.println("Elapsed = " + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "ms"); 
System.out.println("Number of records processed = " + i); 

を(私は二回permitsPerSecond数に試行回数を設定することに注意してください。)あなたは1permitsPerSecondを設定すると、次のように表示されます:

経過処理されたレコードの= 1001ms
数= 2

permitsPerSecond = 10;について

permitsPerSecond = 100;それだろ101番目、第11またはRateLimiterで設定された制限を待つを試みるため2S限界(数学的な意味で)アプローチ:レコードの

経過= 1902ms
数処理= 20

経過時間= 1991ms
処理レコード数= 200

関連する問題