谷歌RateLimiter不工作计数器
问题描述:
我有限制电话为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秒完成。难道我做错了什么?
答
RateLimiter工作正常。问题是你的输出被缓冲了,因为你没有每次都刷新它。通常,标准输出是行缓冲的。所以,如果你写了
System.out.println("Number of records processed = " + (i+1));
你会在100。但是却出现了停顿,你有什么:
是System.out.print( “\处理的记录rNumber =” + I + 1) ;
有两个问题。首先,“\ r”不被视为新行,不会导致冲洗;因此整个输出缓冲并一次打印到控制台。其次,你需要把(i + 1)放在括号内。你有什么附加到字符串,然后附加1到结果字符串。
答
除了@ 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
数量的两倍数)当您设置permitsPerSecond
到1
,你会看到:
消逝= 1001ms
处理的记录数= 2
对于permitsPerSecond = 10;
和permitsPerSecond = 100;
它会方法(在数学意义上)2S限制,因为11日第101次或尝试极限RateLimiter
设置等待:
消逝= 1902ms
记录数处理= 20
和
已用= 1991ms
已处理记录数= 200