我有一个做一些IO的方法,我想限制对这个方法的调用(每秒),以避免后端获得无法处理的并发请求突发。
如果需求没有“每秒”,我可以在开始请求时使用堆栈(基本上只是一个计数器)和offer()
,在完成请求时使用poll()
。有了“每秒”的要求,我需要以某种方式清理堆栈上比给定时间段更旧的插槽。
我该如何正确地做到这一点呢?显然,这个结构应该是线程安全的。
谢谢您抽时间见我!
发布于 2011-05-19 00:26:08
看看this question吧。答案同样适用于这个问题,即使问题的表达方式截然不同。
我承认,我觉得它有点神秘,但它工作得很好。
发布于 2011-05-18 17:36:23
您可以使用队列,但需要进行一些修改。每当您想要添加到队列中(该方法被调用)时,您需要检查其中有多少元素以及它们是何时添加的。可以删除超过一秒之前插入的所有元素。将剩余元素的数量与每秒的速率进行比较,您就可以决定是否拒绝方法执行。如果你打算使用方法块而不是reject,事情可能会变得有点复杂。
可能有许多可能的实现,您必须检查它们对于您的问题是否可行。您还可以查看Token buckets的实现,这是您的问题的一般概念。
发布于 2011-05-18 17:57:55
听起来您需要将IO工作与请求线程解耦,并将其卸载到具有给定大小的线程池中。这样,您就可以显式地控制同时执行IO的线程的数量。
ExecutorService pool = Executors.newFixedThreadPool(10);
public void myMethod() {
pool.submit(new Runnable() {
public void run() {
//Do IO work here
}
});
}
在本例中,执行IO工作的线程永远不会超过10个。它不限制每秒请求的数量,但控制并发性可能是一种更好的节流方式。
https://stackoverflow.com/questions/6042522
复制相似问题