Scala 具有速率和并发限制的ExecutionContext

Scala 具有速率和并发限制的ExecutionContext,scala,concurrency,future,rate-limiting,executioncontext,Scala,Concurrency,Future,Rate Limiting,Executioncontext,假设我有一个简单的HTTP客户机,其方法很简单,如下所示: def httpGet(url: String)(implicit ec: ExecutionContext): Future[String] = Future { io.Source.fromURL(url).mkString } 假设我对具有速率和并发限制的服务器调用它。我认为这些限制应该在ExecutionContext中实现 并发限制只是支持某些ExecutionContext的java.util.concurrent.E

假设我有一个简单的HTTP客户机,其方法很简单,如下所示:

def httpGet(url: String)(implicit ec: ExecutionContext): Future[String] = Future {
  io.Source.fromURL(url).mkString
}
假设我对具有速率和并发限制的服务器调用它。我认为这些限制应该在
ExecutionContext
中实现

并发限制只是支持某些
ExecutionContext
java.util.concurrent.Executor的线程数。利率限制也应该是执行上下文的一部分。因此,我们可以编写一个扩展
ExecutionContext
的新类来实现速率和并发限制,并使用该类的一个实例来调用
httpGet

class ExecutionContextWithRateAndConcurrencyLimits(
  numThreads: Int, // for concurrency limit
  rate: Rate       // requests per time unit
) extends ExecutionContex { ... }


val ec = new ExecutionContextWithRateAndConcurrencyLimits(
  numThreads = 100,
  rate = Rate(1000, 1.sec)
)

val fut = httpGet(url)(ec)

您是否同意速率和并发限制应该在
ExceptionContext
中实现?您知道这样的实现吗?

ExecutionConext
比只处理HTTP请求更通用,即使在这种简单的情况下,它也不仅仅处理请求。因此,EC不应该考虑这一点,相反,您可能希望创建一个自定义HTTP客户机来管理和抽象所有这些概念;可能有一些图书馆已经这样做了。谢谢。我同意EC不仅仅是HTTP。然而,速率和并发限制也比HTTP更为普遍。它们是执行逻辑的一部分。这就是为什么我认为它们属于EC。而且我想在
ThreadPoolExecutor
中实现这些限制更容易。并发限制只是线程数。速率限制只是阻塞队列顶部的一些逻辑。然后我们可以在这个
ThreadPoolExecutor
的基础上实现一个EC,就是这样。“并发限制只是线程数”不一定,你可以与单个线程并发,看看JS。“速率限制只是阻塞队列顶部的一些逻辑”当然,但您也可以在不直接与之交互的情况下完成它。-您的方法的最大问题是,EC不仅管理HTTP请求,还管理回调和进一步处理;您不想修改的。所以,你需要在请愿前后交换EC(这与在客户端上使用包装器非常相似)。哦,我很高兴我们能达成一致:)我会看看你建议的库。不过,我更喜欢没有3d派对副总裁的“香草”解决方案。