如何在Scala中使用actor时限制并发?

Avi*_*lax 11 concurrency scala actor

我来自Java,我将Runnables 提交给一个ExecutorService由线程池支持的.在Java中非常清楚如何设置线程池大小的限制.

我对使用Scala actor感兴趣,但我不清楚如何限制并发性.

让我们假设,我正在创建一个接受"工作"的网络服务.提交作业的POST请求,我希望我的服务将作业排入队列然后立即返回202 Accepted- 即作业是异步处理的.

如果我使用actor来处理队列中的作业,我如何限制处理的同时作业的数量?

我可以想到几种不同的方法来解决这个问题; 我想知道是否有社区最佳实践,或者至少是一些明确建立的方法,这些方法在Scala世界中有些标准.

我想到的一种方法是让一个协调员角色来管理工作队列和工作处理者; 我想它可以使用一个简单的int字段来跟踪当前正在处理的作业数.我确信这种方法会有一些问题,例如确保跟踪何时发生错误以减少数量.这就是为什么我想知道Scala是否已经为此提供了更简单或更封装的方法.

顺便说一句我以前试过问这个问题,但我问得很厉害.

谢谢!

Vik*_*ang 7

我真的很鼓励你看看Akka,Scala的替代Actor实现.

http://www.akkasource.org

Akka已经有了一个JAX-RS [1]集成,您可以将它与LoadBalancer [2]配合使用,以限制在并行中可以执行的操作数量:

[1] http://doc.akkasource.org/rest [2] http://github.com/jboner/akka/blob/master/akka-patterns/src/main/scala/Patterns.scala


oxb*_*kes 5

您可以覆盖系统属性actors.maxPoolSizeactors.corePoolSize限制actor线程池的大小,然后在actor中处理尽可能多的作业.为什么你认为你需要扼杀你的反应?

  • 这种方法可能无法产生预期的结果.它将允许作业排队,直到JVM内存不足.限制actor可以使用的线程数将仅限制实际并发执行的作业数.我通过比演员之前的工作更快地生成工作来产生OOM错误,所以你必须要小心. (3认同)
  • 我认为这种方法的一个缺点是它是全球性的.有时我需要运行不同类型的进程,这些进程具有不同的资源利用率 - 使用Java线程池,我可以轻松地使用具有不同设置的不同池.使用`actors.maxPoolSize`,我只能为所有actor使用一个数字,因为它们都由相同的线程池驱动,对吧? (2认同)