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

标签 multithreading scala playframework-2.0 threadpool actor

假设我们的 Controller 中有一个 Action 。在每次请求时,许多用户都会调用 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 的作用。基本上从接收请求的主线程开始,它跨越多个工作线程,这些工作线程将工作分成几个 block 。最终主线程将加入这些结果并从函数返回。

另一方面,如果我选择thread-pool-executor,我的理解是从线程池中选择一个线程,这个被选中的线程会完成工作,然后回到线程池中监听更多的工作要做。所以这里没有任务的分割。

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

谢谢

最佳答案

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

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

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

关于multithreading - Play Framework : thread-pool-executor vs fork-join-executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697550/

相关文章:

c++ - 使用来自 CreateFile 的有效句柄来自 ReadFileEx 的无效句柄错误

c 多线程冲突

c# - 在每个线程中获取下一个值的正确方法是什么?

scala - 嵌入式 scala 与嵌入式 groovy

algorithm - 如何使用 PartialOrdering 对集合进行排序?

scala - Playframework 2.0 在 View 模板中定义函数

javafx线程限制为32?

scala - 编译 scala 时,对象 hbase 不是包 org.apache.hadoop 的成员

playframework-2.0 - Play框架模板编译错误

scala - Play Framework 2 如何在 View 模板中获取当前页面 URL