假设我在Scala
中有一个服务器,它处理传入的客户端请求。我有一个函数def process(req: Request): Response
来处理请求。现在,我想同时处理K
个请求,并将M
个请求保留在队列中。
在Java
中,我可能会创建一个ThreadPoolExecutor
个K
个帖子和一个大小为M
的队列。现在我想知道如何在Scala
Actors/Futures
等
答案 0 :(得分:2)
如果您必须拥有def process(req: Request): Response)
,那么我认为您的Scala解决方案可能与Java类似。如果你可以拥有def process(req: Request): Future[Response]
,它就会打开其他可能性。
使用future时,您提供(隐式或显式)可以从Java执行器构造的execution context。因此,您可以通过这种方式选择线程池大小和队列大小。使用期货的好处是您可以使用map
和flatMap
以及其他一些组合器来组合它们。有关详细信息,请参阅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所拥有的任何东西,并提供更多机制来完成更复杂的事情。