2017-10-20 83 views
0

我有限制电话为100 /秒的情况。谷歌RateLimiter不工作计数器

我在考虑使用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

RateLimiter工作正常。问题是你的输出被缓冲了,因为你没有每次都刷新它。通常,标准输出是行缓冲的。所以,如果你写了

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

你会在100。但是却出现了停顿,你有什么:

是System.out.print( “\处理的记录rNumber =” + I + 1) ;

有两个问题。首先,“\ r”不被视为新行,不会导致冲洗;因此整个输出缓冲并一次打印到控制台。其次,你需要把(i + 1)放在括号内。你有什么附加到字符串,然后附加1到结果字符串。

2

除了@ DodgyCodeException的关于输出潮红和连接+1建议,让我们运行这段代码,以确保您了解如何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数量的两倍数)当您设置permitsPerSecond1,你会看到:

消逝= 1001ms
处理的记录数= 2

对于permitsPerSecond = 10;permitsPerSecond = 100;它会方法(在数学意义上)2S限制,因为11日第101次或尝试极限RateLimiter设置等待:

消逝= 1902ms
记录数处理= 20

已用= 1991ms
已处理记录数= 200