Play Framework:thread-pool-executor vs fork-join-executor

时间:2014-05-16 14:16:43

标签: multithreading scala playframework-2.0 threadpool actor

我们说我们的控制器下面有一个动作。在每个请求中,许多用户都会调用performLogin。

def performLogin( ) = {
    Async {
        // API call to the datasource1
        val id = databaseService1.getIdForUser();

        // API call to another data source different from above
        // This process depends on id returned by the call above
        val user = databaseService2.getUserGivenId(id);

        // Very CPU intensive task 
        val token = performProcess(user)

        // Very CPU intensive calculations
        val hash = encrypt(user)

        Future.successful(hash)
    }
}

我知道fork-join-executor的作用。基本上,从接收请求的主线程,它跨越多个工作线程,这些工作线程将工作分成几个块。最终主线程将加入这些结果并从函数返回。

另一方面,如果我选择了线程池执行器,我的理解是从线程池中选择一个线程,这个选定的线程将完成工作,然后返回线程池来监听要做更多的工作。所以这里没有发生任务的细分。

在上面的代码中,fork-join执行程序的并行性在我看来是不可能的。每次调用不同的方法/函数都需要上一步的操作。如果我选择fork-join执行器来进行线程化,那对我有什么好处呢? fork-join与线程池执行器之间的代码执行有何不同。

由于

1 个答案:

答案 0 :(得分:6)

这不是并行代码,Async调用内的所有内容都将在一个线程中运行。事实上,玩! 从不生成新线程以响应请求 - 它是基于事件的,有一个底层线程池可以处理需要完成的任何工作。

执行程序处理来自Akka actor和大多数Futures(不是使用Future.successfulFuture.failed创建的)的工作安排。在这种情况下,每个请求都是执行者必须安排到线程上的单独任务。

fork-join-executor取代了thread-pool-executor,因为它允许工作窃取,从而提高了效率。可以与两个执行器并行化的内容没有区别。