我们说我们的控制器下面有一个动作。在每个请求中,许多用户都会调用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与线程池执行器之间的代码执行有何不同。
由于
答案 0 :(得分:6)
这不是并行代码,Async
调用内的所有内容都将在一个线程中运行。事实上,玩! 从不生成新线程以响应请求 - 它是基于事件的,有一个底层线程池可以处理需要完成的任何工作。
执行程序处理来自Akka actor和大多数Futures(不是使用Future.successful
或Future.failed
创建的)的工作安排。在这种情况下,每个请求都是执行者必须安排到线程上的单独任务。
fork-join-executor取代了thread-pool-executor,因为它允许工作窃取,从而提高了效率。可以与两个执行器并行化的内容没有区别。