如何在Scala中组织并发请求处理?

时间:2013-06-29 17:16:45

标签: scala concurrency client-server actor

假设我在Scala中有一个服务器,它处理传入的客户端请求。我有一个函数def process(req: Request): Response来处理请求。现在,我想同时处理K个请求,并将M个请求保留在队列中。

Java中,我可能会创建一个ThreadPoolExecutorK个帖子和一个大小为M的队列。现在我想知道如何在Scala Actors/Futures

}中做到这一点

1 个答案:

答案 0 :(得分:2)

如果您必须拥有def process(req: Request): Response),那么我认为您的Scala解决方案可能与Java类似。如果你可以拥有def process(req: Request): Future[Response],它就会打开其他可能性。

使用future时,您提供(隐式或显式)可以从Java执行器构造的execution context。因此,您可以通过这种方式选择线程池大小和队列大小。使用期货的好处是您可以使用mapflatMap以及其他一些组合器来组合它们。有关详细信息,请参阅http://docs.scala-lang.org/overviews/core/futures.html

使用actor,您可以创建另一种并发模型,您可以在其中创建K个actor。您可以使用router将每个请求分派给actor。每个actor都独立地处理请求,并在处理完成时将Response发送给它需要的任何东西。关于actor的好处是每个独立的actor通常不与其他actor共享任何东西,所以你不必同步代码。有关详细信息,请参阅http://doc.akka.io/docs/akka/2.1.4/general/terminology.html

总的来说,我认为Scala可以使用Java所拥有的任何东西,并提供更多机制来完成更复杂的事情。