Multithreading scala cann的未来';当未来数大于cpu核心数时,不能异步运行
我用Future用scala语言实现了一个多线程函数。但当未来的线程数大于cpu核心数时,线程被分成多个组。一个组中的线程完成,然后其他组中的其他线程开始。下面列出了我的代码和输出。我的代码中是否有错误,如何修复Multithreading scala cann的未来';当未来数大于cpu核心数时,不能异步运行,multithreading,scala,future,blocking,Multithreading,Scala,Future,Blocking,我用Future用scala语言实现了一个多线程函数。但当未来的线程数大于cpu核心数时,线程被分成多个组。一个组中的线程完成,然后其他组中的其他线程开始。下面列出了我的代码和输出。我的代码中是否有错误,如何修复 进程已完成,退出代码为0。您可以创建自己的执行上下文 import java.util.concurrent.Executors import scala.concurrent.ExecutionContext object CustomExecutionContext { p
进程已完成,退出代码为0。您可以创建自己的执行上下文
import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext
object CustomExecutionContext {
private val availableProcessors = Runtime.getRuntime.availableProcessors()
implicit val nDExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(availableProcessors * N)) // N is number of threads
}
implicit val ec = ThrottledExecutionContext(maxConcurrents = 4)(scala.concurrent.ExecutionContext.global)
另一个解决方案:使用FixedThreadPool
控制未来并行执行的次数。它将首先启动10个期货,然后在完成这些后启动其他期货
implicit val ec = ExecutionContext.fromExecutor(java.util.concurrent.Executors.newFixedThreadPool(10))
第三种解决方案:您可以使用节流执行上下文
使用此上下文而不是全局执行上下文
import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext
object CustomExecutionContext {
private val availableProcessors = Runtime.getRuntime.availableProcessors()
implicit val nDExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(availableProcessors * N)) // N is number of threads
}
implicit val ec = ThrottledExecutionContext(maxConcurrents = 4)(scala.concurrent.ExecutionContext.global)
这将限制并行性
第四种解决方案:您可以使用
akka fsm
来调节油门 这是ExecutionContext.Implicits.global
的预期行为。如果您想更改它,您需要使用符合您需求的相应执行上下文。您没有指定所需的行为,那么我们如何才能说“如何修复它?”特别有趣的是,如果线程
被设置为10000