限制对方法的调用次数
Throttle the number of calls to a method
在我的代码中,我将批量请求发送到自定义数据库。
每个批次的响应时间以毫秒为单位。
但是我对每秒可以发送的批次数量有限制。最多一批。在额外批次的情况下,该批次将被丢弃,这不是所希望的。
我可以使用 Thread.sleep()
一秒钟,这样我就不会以每秒超过一个批次的速度访问数据库。
伪代码如下:
createBatch()
sendBatch()
我想做的是限制每秒调用 sendBatch()
的次数。
我可以使用任何节流库而不是使用 Thread.sleep()
来实现吗?
我认为这是限制一次可以使用的资源数量的问题。尝试使用池化技术。在 java 中,您可以使用 ExecutorService 来做同样的事情。参考 - http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
这是示例代码
class Worker implements Callable<String> {
private int id;
public Worker(int id) {
this.id = id;
System.out.println("im worker = " + id);
}
public String call() throws Exception {
System.out.println("Started some long operation - " + id);
Thread.sleep(1000); // only to simulate long running operation
System.out.println("Fiished long operation - " + id);
return null;
}
}
// 主要方法
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws ExecutionException, InterruptedException {
final int poolSize = 100;
final int workerSize = 1000;
ExecutorService executor = Executors.newFixedThreadPool(poolSize);
Future[] futures = new Future[workerSize];
Worker[] workers = new Worker[workerSize];
for(int i = 0; i < workerSize; i++){
workers[i] = new Worker(i);
}
System.out.println("finished creating workers================");
for(int i = 0; i < workerSize; i++){
futures[i] = executor.submit(workers[i]);
}
for (int i = 0; i < workerSize; i++){
futures[i].get();
}
System.out.println("Finished executing all");
executor.shutdown();
}
}
您可以使用 guava 中的 RateLimiter。
参见:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html
在我的代码中,我将批量请求发送到自定义数据库。 每个批次的响应时间以毫秒为单位。
但是我对每秒可以发送的批次数量有限制。最多一批。在额外批次的情况下,该批次将被丢弃,这不是所希望的。
我可以使用 Thread.sleep()
一秒钟,这样我就不会以每秒超过一个批次的速度访问数据库。
伪代码如下:
createBatch()
sendBatch()
我想做的是限制每秒调用 sendBatch()
的次数。
我可以使用任何节流库而不是使用 Thread.sleep()
来实现吗?
我认为这是限制一次可以使用的资源数量的问题。尝试使用池化技术。在 java 中,您可以使用 ExecutorService 来做同样的事情。参考 - http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html 这是示例代码
class Worker implements Callable<String> {
private int id;
public Worker(int id) {
this.id = id;
System.out.println("im worker = " + id);
}
public String call() throws Exception {
System.out.println("Started some long operation - " + id);
Thread.sleep(1000); // only to simulate long running operation
System.out.println("Fiished long operation - " + id);
return null;
}
}
// 主要方法
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws ExecutionException, InterruptedException {
final int poolSize = 100;
final int workerSize = 1000;
ExecutorService executor = Executors.newFixedThreadPool(poolSize);
Future[] futures = new Future[workerSize];
Worker[] workers = new Worker[workerSize];
for(int i = 0; i < workerSize; i++){
workers[i] = new Worker(i);
}
System.out.println("finished creating workers================");
for(int i = 0; i < workerSize; i++){
futures[i] = executor.submit(workers[i]);
}
for (int i = 0; i < workerSize; i++){
futures[i].get();
}
System.out.println("Finished executing all");
executor.shutdown();
}
}
您可以使用 guava 中的 RateLimiter。
参见:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html