2013-06-29 36 views
1

假设我有一个服务器Scala,它处理传入的客户端请求。我有一个功能def process(req: Request): Response来处理请求。现在我只想同时处理K个请求,并在队列中保留M个请求。如何在Scala中组织并发请求处理?

Java我可能会创建一个ThreadPoolExecutorK线程和大小M的队列。现在我想知道如何在ScalaActors/Futures

回答

2

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

使用期货时,您提供(隐式或显式)可从Java执行程序构建的execution context。所以你可以选择你的线程池大小和队列大小。使用期货的好处是你可以用mapflatMap以及其他几个组合器来组合它们。有关更多信息,请参阅http://docs.scala-lang.org/overviews/core/futures.html

对于演员,您有另一种并发模型,您可以在其中创建K演员。您可以有一个router将每个请求分派给参与者。每个角色都独立处理请求,并在处理完成时发送Response以满足任何需求。关于演员的好处是每个演员都是独立的,通常不会与其他演员共享任何东西,所以你不必同步代码。有关更多信息,请参阅http://doc.akka.io/docs/akka/2.1.4/general/terminology.html。总的来说,我认为Scala可以使用Java所具有的任何东西,并提供更多机制来完成更复杂的事情。